Quadrati latini a prova di rotazione


12

Un quadrato latino è una piazza che non ha ripetuto simboli X o Y colonne . Per esempio:

ABCD    
DABC
CDAB
BCDA

è uno di questi quadrati. Notare come ogni colonna e riga contenga una permutazione delle stesse 4 lettere.

Tuttavia, il nostro quadrato latino ha un problema: se dovessi ruotare la seconda fila ( DABC) di 1 a sinistra, finirei con ABCD, che è identico alla permutazione sopra di essa. Se è impossibile ruotare 1 colonna / riga e ottenere un'altra colonna / riga, allora consideriamo il quadrato sicuro dalla rotazione .

Per esempio:

ABCD
BDAC
CADB
DCBA

la rotazione è sicura. La griglia ha le seguenti proprietà:

  1. Il punto [0, N] utilizza l'ennesimo simbolo
  2. Il punto [0, N] e [N, 0] sono sempre lo stesso simbolo . (Vorrei anche dire che [x, y] e [y, x] sono sempre la stessa lettera, ma non posso provarlo)

Il tuo compito è quello di stampare 1 quadrato latino sicuro dalla rotazione, quando viene passato N. Non mi importa se hai prodotto lettere, numeri, un elenco o un array 2D. Se si utilizzano numeri, la colonna e la riga in alto devono essere 0,1,2,3,...(in questo ordine). Se usi le lettere, allora deve essereA,B,C,D,....

Ad esempio, se l'input era 4, è necessario stampare:

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

Non ci sono quadrati latini a prova di rotazione di dimensioni inferiori a 4. Non mi interessa cosa fa il tuo programma se N è inferiore a 4. Per i curiosi, il numero di quadrati a prova di rotazione è (a partire da 4): 2,5,5906,(too long to calculate)

Questo è un , quindi cerca di dare risposte il più brevi possibile nella tua lingua preferita!


C'è un limite di tempo? (Correlati: sono consentiti i metodi Monte Carlo se tecnicamente non è garantito che terminino per valori elevati a Ncausa dell'insufficiente qualità dei numeri casuali?)
Maniglia della porta

Nessun limite di tempo, ma la soluzione dovrebbe essere chiusa.
Nathan Merrill,

1
Per le lingue con 1 indice, può essere la prima riga 1,2,3,...?
miglia


@miles sì, va bene
Nathan Merrill

Risposte:



2

SQL Server 2012 - 918 byte

Sulla mia scatola questo funziona per @k = 5, anche se ci vogliono 16 secondi.

Questo è il codice di costruzione del codice (attenzione Skynet, hai concorrenza)

C'è un prezzo per la sceneggiatura più lunga?

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)

Prova online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.