Kotak Latin yang aman rotasi

12

A Latin persegi adalah persegi yang ada telah berulang simbol baik dalam X atau kolom Y . Sebagai contoh:

ABCD    
DABC
CDAB
BCDA

adalah salah satu kotak tersebut. Perhatikan bagaimana setiap kolom dan baris berisi permutasi dari 4 huruf yang sama.

Namun, persegi Latin kami memiliki masalah: Jika saya memutar baris kedua ( DABC) 1 ke kiri, saya akan berakhir dengan ABCD, yang identik dengan permutasi di atasnya. Jika tidak mungkin untuk memutar 1 kolom / baris dan mendapatkan kolom / baris lain, maka kami menganggap kuadrat tersebut aman untuk dirotasi .

Sebagai contoh:

ABCD
BDAC
CADB
DCBA

Apakah rotasi aman. Kotak memiliki properti berikut:

  1. Titik [0, N] menggunakan simbol Nth
  2. Titik [0, N] dan [N, 0] selalu merupakan simbol yang sama . (Saya juga ingin mengatakan bahwa [x, y] dan [y, x] juga selalu merupakan huruf yang sama, tetapi saya tidak dapat membuktikannya)

Tugas Anda adalah mencetak 1 kotak Latin yang aman untuk rotasi, ketika dilewatkan N. Saya tidak peduli jika Anda mengeluarkan huruf, angka, daftar, atau array 2D. Jika Anda menggunakan angka, kolom dan baris atas harus 0,1,2,3,...(dalam urutan itu). Jika Anda menggunakan huruf, maka itu harusA,B,C,D,....

Misalnya, jika input Anda adalah 4, Anda harus mencetak:

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

Tidak ada kotak Latin aman rotasi dengan ukuran kurang dari 4. Saya tidak peduli apa program Anda lakukan jika N kurang dari 4. Untuk yang ingin tahu, jumlah kotak aman rotasi adalah (mulai dari 4): 2,5,5906,(too long to calculate)

Ini adalah , jadi cobalah membuat jawaban sesingkat mungkin dalam bahasa favorit Anda!

Nathan Merrill
sumber
Apakah ada batasan waktu? (Terkait: Apakah metode Monte Carlo diperbolehkan jika secara teknis mereka tidak dijamin akan berakhir karena nilai Nkualitas acak yang kurang?)
Gagang Pintu
Tidak ada batas waktu, tetapi solusi Anda harus dijamin akan berakhir.
Nathan Merrill
1
Untuk bahasa yang diindeks 1, dapatkah baris pertama dibuat 1,2,3,...?
mil
terkait , terkait
Abr001am
@miles ya, tidak apa
Nathan Merrill

Jawaban:

2

Sqlserver 2012 - 918 bytes

Di kotak saya ini berjalan untuk @ k = 5, meskipun butuh 16 detik.

Ini adalah kode pembuatan kode (hati-hati Skynet, Anda memiliki persaingan)

Apakah ada harga untuk skrip terpanjang?

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)

Coba online!

t-clausen.dk
sumber