Łacińskie kwadraty odporne na rotację

12

Kwadrat łaciński jest kwadrat, który nie powtórzył symboli X lub Y kolumn . Na przykład:

ABCD    
DABC
CDAB
BCDA

jest jednym z takich kwadratów. Zauważ, że każda kolumna i wiersz zawiera permutację tych samych 4 liter.

Jednak nasz kwadrat łaciński ma problem: gdybym obrócił drugi rząd ( DABC) 1 w lewo, skończyłbym na tym ABCD, co jest identyczne z permutacją nad nim. Jeśli nie można obrócić 1 kolumny / wiersza i uzyskać innej kolumny / wiersza, wówczas uważamy kwadrat za bezpieczny dla obrotu .

Na przykład:

ABCD
BDAC
CADB
DCBA

jest bezpieczny w obrocie. Siatka ma następujące właściwości:

  1. Punkt [0, N] używa N-tego symbolu
  2. Punkty [0, N] i [N, 0] są zawsze tym samym symbolem . (Chciałbym również powiedzieć, że [x, y] i [y, x] są również zawsze tą samą literą, ale nie mogę tego udowodnić)

Twoim zadaniem jest wydrukować 1 bezpieczny łaciński kwadrat po przejściu N. Nie dbam o to, czy wypiszesz litery, cyfry, listę lub tablicę 2D. Jeśli używasz liczb, górna kolumna i wiersz muszą być 0,1,2,3,...(w tej kolejności). Jeśli używasz liter, to musi byćA,B,C,D,....

Na przykład, jeśli wprowadzono 4, należy wydrukować:

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

Nie ma bezpiecznych obrotów łacińskich kwadratów o rozmiarze mniejszym niż 4. Nie obchodzi mnie, co robi twój program, jeśli N jest mniejsze niż 4. Dla ciekawskich liczba bezpiecznych obrotów to (zaczynając od 4): 2,5,5906,(too long to calculate)

To jest , więc staraj się, aby odpowiedzi były jak najkrótsze w swoim ulubionym języku!

Nathan Merrill
źródło
Czy istnieje limit czasowy? (Powiązane: Czy metody Monte Carlo są dozwolone, jeśli nie można zagwarantować, że zakończą się z Npowodu wysokich wartości z powodu niewystarczającej jakości liczb losowych?)
Klamka
Bez limitu czasu, ale rozwiązanie powinno zostać zakończone.
Nathan Merrill,
1
Czy w przypadku języków z 1 indeksowanym pierwszym wierszem może być 1,2,3,...?
mile
powiązane , powiązane
Abr001am
@miles tak, w porządku
Nathan Merrill

Odpowiedzi:

2

Sqlserver 2012 - 918 bajtów

Na moim komputerze działa to dla @k = 5, chociaż zajmuje 16 sekund.

To jest kod budujący kod (uważaj, Skynet, masz konkurencję)

Czy istnieje cena za najdłuższy skrypt?

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)

Wypróbuj online!

t-clausen.dk
źródło