Considere una cuadrícula de N
x N
elementos únicos. Cada elemento tiene una letra (de A a la N
letra, inclusive) y un número (de 1 a N
, inclusive). Por lo tanto, cada par número / letra está en la cuadrícula exactamente una vez.
Su trabajo es organizar una cuadrícula de manera que:
Cada fila, columna y diagonal (incluida la envoltura) contiene cada letra y número exactamente una vez.
Al envolver, quiero decir que
* * * # *
* * # * *
* # * * *
# * * * *
* * * * #
es una diagonal, junto con todas las diagonales similares que golpean los bordes.
Un ejemplo de 5x5
cuadrícula es:
A1 B2 C3 D4 E5
C4 D5 E1 A2 B3
E2 A3 B4 C5 D1
B5 C1 D2 E3 A4
D3 E4 A5 B1 C2
Su tarea es escribir un programa que acepte un número N
e imprimir una cuadrícula N
x N
como se describió anteriormente. Su programa debería funcionar para cualquiera 0 < N <= 26
. Si no es posible una cuadrícula en particular, debe imprimir Impossible
.
Codificar la respuesta para cualquiera N
no está permitido. Un programa está codificado si calcula la cuadrícula de manera diferente (según mi criterio) para cualquiera N > 26
(o si no puede calcular). (Esto está destinado a evitar el precalculado, incluidas las cuadrículas inválidas precalculadas o las compensaciones para cuadrículas determinadas).
Este es un problema de código más rápido, y su puntaje es la suma de los tiempos necesarios para ejecutar su programa en todo lo posible N
en mi computadora. En su respuesta, haga que su programa se ejecute en todos N
(así que solo tengo que cronometrarlo una vez). Si ningún programa puede calcularlo en menos de 60 segundos, entonces el ganador es la respuesta que puede calcular la cuadrícula con la mayor N
en 60 segundos. Si varios programas tienen el mismo máximo N
, entonces el desempate es la solución más rápida.
(Tengo una máquina con Windows 8 decente, y todos los compiladores o intérpretes necesarios deben estar disponibles de forma gratuita).
fuente
Respuestas:
Python 3
¿Cómo funciona?
La implementación ingenua sería mirar a través de todos los arreglos posibles de letras y números en una cuadrícula NxN y buscar uno que también sea un Cuadrado Latino Ortogonal-Diagonal (ODLS) (y, por lo tanto, para algunos solo tendría que pasar por todos configuraciones y retorno imposibles). Tal algoritmo no sería adecuado para este desafío debido a la absurda complejidad del tiempo. Por lo tanto, existen tres simplificaciones y justificaciones principales (pruebas parciales e información sobre por qué funciona) para las construcciones ODLS utilizadas en mi implementación:
La primera es la noción de que solo necesitamos generar un Diagonal Latin Square válido (una cuadrícula NxN tal que cada fila, columna, diagonal envuelta contenga cada elemento de un conjunto de N elementos distintos exactamente una vez) de las primeras N letras de la alfabeto. Si podemos construir un Cuadrado Latino Diagonal (DLS), entonces se puede construir un ODLS usando el DLS con el intercambio apropiado de elementos y volteo. Justificación:
La segunda simplificación es la noción de que si encontramos una configuración adecuada (SC) de un elemento (una cuadrícula NxN de manera que cada fila, columna, diagonal envuelta contenga ese elemento exactamente una vez), se podría construir un DLS reemplazando el elemento y cambiando el SC. Justificación:
La última simplificación es la siguiente: todos los DLS de N primo, excepto N = 2 o N = 3, pueden construirse, y si N puede factorizarse en dos números cuyo DLS apropiado puede construirse, entonces un DLS de ese N puede ser construido Supongo que lo contrario también es válido. (En otras palabras, solo podemos construir un DLS para N que no sea divisible por 2 o 3)
Una imagen de lo que quise decir con el DLS más pequeño y más grande
fuente