Descargo de responsabilidad: no conozco ninguna solución que no sea de fuerza bruta
Un cuadrado greco-latino es, para dos conjuntos de la misma longitud , una disposición de celdas , cada una de las cuales contiene un par único (en todo el cuadrado) de un elemento del primer conjunto y un elemento del segundo conjunto, como que todos los primeros elementos y todos los segundos elementos de los pares son únicos en su fila y columna. Los conjuntos más comunes utilizados son, como se podría adivinar, las primeras letras de los alfabetos griego y latino.
Aquí hay una foto de un cuadrado greco-latino 4x4:
Los cuadrados greco-latinos son tan útiles como parecen (el artículo de Wikipedia menciona "diseño de experimentos, programación de torneos y construcción de cuadrados mágicos"). Su tarea es, dado un entero positivo , generar un cuadrado greco-latino.
Entrada
Un entero positivo ; se garantiza que existe un cuadrado greco-latino (es decir, ).
Salida
Un cuadrado greco-latino con longitud lateral n como una matriz bidimensional, una matriz de matrices, una matriz aplanada o con salida directa.
Notas
- No tiene que usar los alfabetos griego y latino específicamente; por ejemplo, también se permite generar pares de enteros positivos.
- Si elige usar un alfabeto que no se puede extender arbitrariamente, debe (en teoría; su código no tiene que terminar antes de la muerte por calor del universo) admitir una longitud lateral máxima de al menos 20.
Este es el código de golf , por lo que gana el código más corto.
Respuestas:
Jalea ,
2120 bytes-1 gracias a Nick Kennedy (la opción de salida plana permite guardar un byte de→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
)Pruébalo en línea! (Demasiado lento para los
4
60 en TIO, pero si reemplazamos el poder cartesianoṗ
, con Combinacionesœc
, se completará , ¡aunque 5 ciertamente no lo harán!)¿Cómo?
fuente
05AB1E ,
262322 bytes-3 bytes gracias a Emigna
-1 byte gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
n<ÝI‰
puede ser<Ýã
<Ý
puede serL
. ¡Gracias!ê}DIùQ
puede serÙgQ}P
guardar un byte.R ,
164148bytes-muchos bytes gracias a Giuseppe.
Pruébalo en línea!
Dramáticamente ineficiente: creo que es aún peor que otros enfoques de fuerza bruta. Incluso para
n=3
, probablemente caducará en TIO. Aquí hay una versión alternativa (155 bytes) que funcionan=3
en aproximadamente 1 segundo.m
l
g
all(1:n^2%in%(n*l+g-n))
l
g
l
yg
cuadrados latinos?!
l
g
2^l
l
t(l)
l
g
sd
Una nota final: con tanta frecuencia en el golf de código R, utilicé la variable
T
, que se inicializa comoTRUE
, para ganar algunos bytes. Pero esto significa que cuando necesitaba el valor realTRUE
en la definición dem
(parámetroreplace
ensample
), tenía que usar en1
lugar deT
. Del mismo modo, como estoy redefiniendo!
como una función diferente de la negación, tuve que usar en1-all(...)
lugar de!all(...)
.fuente
JavaScript (ES6),
159 147140 bytesEsta es una simple búsqueda de fuerza bruta, y por lo tanto muy lenta.
Pruébalo en línea! (con salida prettified)
Comentado
fuente
o
; puedes regresarm
al final por 141Haskell ,
207 143233 bytesPruébalo en línea!
OK, creo que finalmente lo entendí esta vez. Funciona bien para n = 5, n = 6 veces en TIO, pero creo que eso podría deberse a que este nuevo algoritmo es INCREÍBLEMENTE ineficiente y básicamente verifica todas las posibilidades hasta que encuentre uno que funcione. Estoy ejecutando n = 6 en mi computadora portátil ahora para ver si termina con algo más de tiempo.
Gracias de nuevo a @someone por señalar los errores en mis versiones anteriores
fuente
C #,
520506494484 bytesEl algoritmo de encontrar un cuadrado es muy simple. Es ... fuerza bruta. Sí, es estúpido, pero el código de golf no se trata de la velocidad de un programa, ¿verdad?
El código antes de hacerlo más corto:
Ahora, si quieres probarlo con n = 3, tendrás que esperar como una hora, así que aquí hay otra versión:
Actualización: olvidé eliminar "público".
Actualización: utiliza "Sistema". en lugar de "usar el sistema"; Además, gracias a Kevin Cruijssen , usó "a" en lugar de "args".
Actualización: gracias a gastropner y alguien .
fuente
args
puede sera
:)for(X = 0; X < Y; X++)
afor(X = Y; X-->0; )
, lo que debería guardar un byte por bucle.i = 0
en la definición dei
y guardar un byte.System
. Además,if((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
puede serif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
o podría guardar bytes al agregarlos\n
a la cadena dentro de la llamada o de lo contrario está roto. Creo que también puede devolver una matriz directamente.Octava , 182 bytes
Método de fuerza bruta, TIO mantiene el tiempo de espera y tuve que ejecutarlo varias veces para obtener la salida para n = 3, pero en teoría esto debería estar bien. En lugar de pares como (1,2), genera una matriz de conjugados complejos como 1 + 2i. Esto podría estar estirando un poco la regla, pero en mi opinión, todavía se ajusta a los requisitos de salida. Sin embargo, debe haber una mejor manera de hacer las dos líneas bajo la declaración de functino, pero no estoy seguro en este momento.
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 123 bytes
Pruébalo en línea!
Utilizo la
TwoWayRule
notaciónTranspose[...,2<->4]
para intercambiar las dimensiones segunda y cuarta de una matriz; de lo contrario, esto es bastante sencillo.Sin golf:
fuente
Python 3 ,
271267241 bytesEnfoque de fuerza bruta: genere todas las permutaciones de los pares hasta que se encuentre un cuadrado greco-latino. Demasiado lento para generar algo más grande que
n=3
en TIO.Gracias a alexz02 por jugar al golf 26 bytes y a ceilingcat por jugar al golf 4 bytes.
Pruébalo en línea!
Explicación:
fuente