Existe un juego mental llamado Enumerate (que hice, basado en Takuzu ). Tu desafío es jugar este juego.
Tarea
Resuelve un juego de 4x4 Enumerate / Takuzu.
- Reciba una grilla inicial a través de STDIN o línea de comando.
- Salida de la cuadrícula resuelta a través de STDOUT o escribiendo en el archivo.
Reglas
Un juego se caracteriza por un tablero de 4x4, formado por celdas rojas y moradas.
Debe haber el mismo número de celdas rojas y moradas en cada fila y columna (2 rojas y 2 moradas en cada una).
No debe haber filas o columnas idénticas.
Entrada
La parrilla de salida será dado como una cadena de 16 caracteres / byte que consiste en solamente 0
, 1
y 2
. Aquí hay un ejemplo:
0001100002001200
1
representa una celda roja y 2
representa una celda púrpura. Todas las placas de entrada serán solucionables.
Nota: Si su idioma no admite la entrada literal de cadenas , puede tomar la entrada como una matriz de enteros. Indique en su respuesta que este es el caso. Entonces no hay confusión, así es como debería verse dicha matriz:
[0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 0]
No se permiten matrices anidadas.
Salida
La placa resuelta debe salir en el mismo formato que el anterior; una cadena de 16 caracteres / byte, que consta de solo 1
y 2
. Aquí está la solución para la entrada anterior:
2121112222111212
Nuevamente, 1
representa una celda roja y 2
representa una celda púrpura.
Bonos
Se ofrece una bonificación de -25 bytes por cualquier respuesta que genere la placa resuelta como una cuadrícula ASCII. Aquí hay un ejemplo del tablero mencionado anteriormente.
2|1|2|1
-+-+-+-
1|1|2|2
-+-+-+-
2|2|1|1
-+-+-+-
1|2|1|2
Se ofrece una bonificación de -50 bytes por cualquier respuesta que muestre la placa resuelta en color. Esto se puede generar como una imagen o texto en color.
Si se elige texto en color, el resultado debería verse así:
2121
1122
2211
1212
Sin embargo, si una imagen es el método de salida elegido, el archivo resultante debe tener 20x20 píxeles, donde cada celda es un bloque de color de 5x5 píxeles. Aquí hay un ejemplo:
Aquí están los códigos de colores:
Red - #a73cba OR (167, 60, 186)
Purple - #f94a32 OR (249, 74, 50)
Muestras
In: 0020010100000100
Out: 1221212112122112
In: 0010000200121000
Out: 2211112221121221
In: 1000100102000000
Out: 1122122122112112
0
,1
y2
? ¿Qué pasa con una matriz bidimensional?Respuestas:
CJam (puntaje 13)
Con bonificación de texto en color, solo caracteres imprimibles: 64 caracteres - 50 = 14
Esto puede mejorarse con un carácter utilizando un carácter no imprimible: se
27c'[@
convierte en"^["\
donde^
representa el carácter 27, dando una puntuación de 13. Versión xxd:Solución directa sin bonificación: 42 caracteres
Demostración en línea
Con bonificación de cuadrícula: 59 caracteres - 25 = 34
Demostración en línea
Con salida de imagen, 83 caracteres - 50 = 33. La salida está en formato netpbm.
Demostración en línea
fuente
CJam, 74-50 = 24 bytes (salida de color)
No creo que esto sea muy bueno, ¡pero funciona! Pruébalo aquí. Advertencia: lento .
l:~:L;
lee una línea de entrada enL
. Entonces,5Zb
es[1 2]
, y tomamos la 16 ª potencia cartesiana (Gm*
) de esta lista, para obtener todas las soluciones posibles[[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2] ...]
. El filtro{ },
contiene la lógica de Takuzu.Agregué un bono de salida de color de código ANSI:
Esto no funciona en el sitio web, por supuesto. Hay un
ESC
byte no imprimible en la cadena"["
.fuente
5Zb
Rubí, 196 bytes
repeated_permutation
, ¿por qué tu nombre debe ser tan largo? -_-Esto simplemente pasa por todas las soluciones posibles hasta que una de ellas coincida con el patrón de entrada.
fuente
C (función) (con gcc incorporado), 283
Esto parecía un desafío interesante para abordar en C. Estoy bastante seguro de que se puede jugar más, pero aquí hay un comienzo:
Entrada pasada como cadena para funcionar
f()
. Salida a STDOUT.Pruébalo en línea.
fuente
JavaScript (ES6), 263
300Dadas las limitaciones, el número de posibles soluciones parece sorprendentemente pequeño: 72
Toda la placa se puede ver como un número de 16 bits.
Valores permitidos para filas (enmascarado 1111): 0011, 0101, 0110 y los valores invertidos 1100, 1010, 1001
Lo mismo para las columnas, solo con diferentes enmascaramiento y bits entremezclados (enmascaramiento 1000100010001): 0 ... 0 ... 1 ... 1, 0 ... 1 ... 0 ... 1, 0 ... 1 ... 1 ... 0 y los valores invertidos
Tenga en cuenta que las disposiciones de bits de filas y columnas son diferentes, por lo que para comprobar la falta de distinción, puede agregar filas y columnas a un conjunto y verificar que el tamaño del conjunto sea == 8.
Código para enumerar todas las soluciones posibles en una cuadrícula 4x4
Prueba
fuente
0x10000
puede ser reemplazado con65536
.C, Puntuación
278257(
328307 bytes - 50 bytes para salida en color, o 291 bytes sin bonificación de color)Este es un método de fuerza bruta que imprime la primera cuadrícula coincidente. Realmente funciona en una cuadrícula girada de 180 grados para simplificar algunos bucles, y utiliza una tabla de búsqueda (59799) para determinar qué filas son válidas. Internamente, todas las cuadrículas son solo números de 16 bits. Toma una sola entrada de cadena de sus argumentos.
Debido a los códigos de escape utilizados para colorear, es posible que desee restablecer el estilo de su terminal después de ejecutar esto (ejecutar
printf "\x1b[0m"
)Descompostura:
Entonces, ¿qué es 59799?
Solo hay 16 estados posibles para cada fila / columna (es un número binario de 4 bits). De esas, las opciones válidas son:
Tomando esos valores como índices de bits, podemos crear una máscara:
Pero aquí queremos saber las filas no válidas :
fuente