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.