Döndürme güvenli Latin kareler


12

Latin karesi, X veya Y sütunlarında yinelenen sembol içermeyen bir karedir . Örneğin:

ABCD    
DABC
CDAB
BCDA

böyle bir karedir. Her sütun ve satırın aynı 4 harfin permütasyonunu nasıl içerdiğine dikkat edin.

Bununla birlikte, Latin karemizin bir sorunu var: İkinci satırı ( DABC) 1 sola döndürürsem, sonuçta ABCDyukarıdaki permütasyonla aynı olur. Herhangi bir 1 sütunu / satırı döndürmek ve başka bir sütun / satır elde etmek mümkün değilse , karenin dönüş güvenli olduğunu düşünüyoruz .

Örneğin:

ABCD
BDAC
CADB
DCBA

rotasyon güvenlidir. Izgara aşağıdaki özelliklere sahiptir:

  1. Nokta [0, N], N. Sembolünü kullanır
  2. [0, N] ve [N, 0] noktaları her zaman aynı semboldür . (Ayrıca [x, y] ve [y, x] 'nin de her zaman aynı mektup olduğunu söylemek isterim, ancak ispat edemiyorum)

Senin görevin N geçtiğinde 1 döndürme güvenli Latin kare yazdırmaktır. Ben harfler, sayılar, bir liste veya bir 2D dizi çıktı umurumda değil. Sayı kullanırsanız, üst sütun ve satır 0,1,2,3,...(bu sırayla) olmalıdır. Harf kullanırsanız,A,B,C,D,....

Örneğin, girdiniz 4 ise aşağıdakilerden birini yazdırmalısınız:

0,1,2,3            0,1,2,3
1,3,0,2     or     1,0,3,2
2,0,3,1            2,3,1,0
3,2,1,0            3,2,0,1

4'ten küçük boyutta döndürme güvenli Latin kareleri yoktur. N 4'ten küçükse programınızın ne yaptığı umurumda değil. Meraklı olarak, döndürme güvenli karelerin sayısı (4'ten başlayarak): 2,5,5906,(too long to calculate)

Bu bir , bu yüzden en sevdiğiniz dilde cevapları mümkün olduğunca kısa yapmaya çalışın!


Zaman sınırı var mı? (İlgili: Monte Carlo yöntemlerine teknik Nolarak yetersiz rasgele sayı kalitesi nedeniyle yüksek değerleri için sonlandırılmaları garanti edilmiyorsa izin verilir mi?)
Kapı tokmağı

Zaman sınırı yoktur, ancak çözümünüzün sonlanacağı garanti edilmelidir.
Nathan Merrill

1
1 endeksli diller için ilk satır olabilir 1,2,3,...mi?
mil


@miles evet, sorun değil
Nathan Merrill

Yanıtlar:



2

Sqlserver 2012-918 bayt

Kutumda bu 16 saniye sürmesine rağmen @k = 5 için çalışıyor.

Bu kod oluşturma kodu (Skynet'e dikkat edin, rekabetiniz var)

En uzun senaryo için bir fiyat var mı?

DECLARE @k int = 4;

DECLARE @t VARCHAR(max)='WITH C as(SELECT
top '+left(@k,1)+'row_number()over(order by 1/0)n
FROM sys.messages),D(nÆ)as(SELECT
concat(~),~
FROM Ø
WHERE |)SELECT top 1~ FROM Å
WHERE 1=1',@
varchar(999)=''SELECT @+=','+CHAR(x+65)FROM(values(0),(1),(2),(3),(4),(5))x(x)WHERE x<@k
SELECT
@t=REPLACE(REPLACE(REPLACE(REPLACE(@t,'Æ',@),'Ø',STUFF(REPLACE(@,',',',C '),1,1,'')),'Å',STUFF(REPLACE(@,',',',D
'),1,1,'')),'~',STUFF(REPLACE(@,',','.n,'),1,3,'')+'.n'),@='';WITH C as(SELECT top(@k)x
FROM(values(0),(1),(2),(3),(4),(5))x(x))SELECT @+=' AND
'+char(65+C.x)+'.n<>'+char(65+D.x)+'.n'FROM c,c d WHERE C.x<D.x
SELECT @t=REPLACE(@t,'|',STUFF(@,1,4,''));WITH A
as(SELECT top(@k)x
FROM(values(65),(66),(67),(68),(69),(70))x(x))SELECT @t+='AND
'+char(A.x)+'.'+char(C.x)+'<>'+CHAR(B.x)+'.'+char(C.x)+' AND
'+char(A.x)+'.n+'+char(A.x)+'.n'+'
not like''%''+'+char(B.x)+'.n+''%'''FROM A,A B,A C
WHERE A.x<>B.x and C.x<>B.x
EXEC(@t)

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.