Cuadrados latinos seguros para la rotación

12

Cuadrada A América es un cuadrado que no se ha repetido símbolos ya sea en la X o columnas de Y . Por ejemplo:

ABCD    
DABC
CDAB
BCDA

es uno de esos cuadrados. Observe cómo cada columna y fila contiene una permutación de las mismas 4 letras.

Sin embargo, nuestro cuadrado latino tiene un problema: siDABCABCD tuviera que girar la segunda fila ( ) 1 a la izquierda, terminaría con , que es idéntico a la permutación que se encuentra arriba. Si es imposible rotar 1 columna / fila y obtener otra columna / fila, entonces consideramos que el cuadrado es seguro para la rotación .

Por ejemplo:

ABCD
BDAC
CADB
DCBA

Es segura la rotación. La cuadrícula tiene las siguientes propiedades:

  1. El punto [0, N] usa el enésimo símbolo
  2. El punto [0, N] y [N, 0] son ​​siempre el mismo símbolo . (Me gustaría decir también que [x, y] y [y, x] también son siempre la misma letra, pero no puedo probarlo)

Su tarea es imprimir 1 cuadrado latino seguro para la rotación, cuando se pasa N. No me importa si imprime letras, números, una lista o una matriz 2D. Si usa números, la columna superior y la fila deben ser 0,1,2,3,...(en ese orden). Si usa letras, entonces debe serA,B,C,D,....

Por ejemplo, si su entrada fue 4, debe imprimir:

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

No hay cuadrados latinos seguros para la rotación de tamaño menor que 4. No me importa lo que haga su programa si N es menor que 4. Para los curiosos, el número de cuadrados seguros para la rotación es (comenzando en 4): 2,5,5906,(too long to calculate)

Este es un , ¡así que trate de hacer las respuestas lo más cortas posible en su idioma favorito!

Nathan Merrill
fuente
¿Hay un límite de tiempo? (Relacionado: ¿Se permiten los métodos de Monte Carlo si técnicamente no se garantiza que terminen por valores altos Ndebido a una calidad de número aleatorio insuficiente?)
Pomo de la puerta
No hay límite de tiempo, pero se debe garantizar que su solución termine.
Nathan Merrill
1
Para idiomas indexados en 1, ¿puede ser la primera fila 1,2,3,...?
millas
@ millas sí, eso está bien
Nathan Merrill

Respuestas:

2

Sqlserver 2012 - 918 bytes

En mi caja, esto funciona para @k = 5, aunque lleva 16 segundos.

Este es el código de construcción del código (cuidado con Skynet, tienes competencia)

¿Hay un precio para el guión más largo?

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)

¡Prueba en línea!

t-clausen.dk
fuente