Introducción
Escriba un solucionador para los acertijos de Hitori utilizando menos bytes.
Reto
Tu tarea es escribir un solucionador para los rompecabezas lógicos Hitori (ひ と り, la palabra para "solo" en japonés; el significado del nombre del juego es "Déjame en paz"). Las reglas son las siguientes:
- Se le presenta una cuadrícula de celdas n por n, cada celda contiene un número entero entre 1 yn (inclusive).
- Su objetivo es asegurarse de que ningún número aparezca más de una vez en cada fila y cada columna de la cuadrícula, eliminando los números de la cuadrícula dada, sujeto a la restricción indicada en las siguientes dos reglas,
- No puede eliminar dos números de dos celdas adyacentes (horizontal o verticalmente).
- Las celdas numeradas restantes deben estar conectadas entre sí. Significa que dos celdas numeradas restantes se pueden conectar con una curva que se compone únicamente de segmentos que conectan números restantes adyacentes (horizontal o verticalmente). (Gracias a @ user202729 por señalar que falta esto)
Espero que las reglas estén claras por ahora. Si no hay algo claro sobre las reglas, consulte la página de Wikipedia .
Casos de prueba
Las celdas de las que se eliminan los números se representan con 0.
Input -> Output
4
2 2 2 4 0 2 0 4
1 4 2 3 -> 1 4 2 3
2 3 2 1 2 3 0 1
3 4 1 2 3 0 1 2
4
4 2 4 3 0 2 4 3
4 1 1 2 -> 4 1 0 2
3 1 2 1 3 0 2 1
4 3 1 3 0 3 1 0
5
1 5 3 1 2 1 5 3 0 2
5 4 1 3 4 5 0 1 3 4
3 4 3 1 5 -> 3 4 0 1 5
4 4 2 3 3 4 0 2 0 3
2 1 5 4 4 2 1 5 4 0
8
4 8 1 6 3 2 5 7 0 8 0 6 3 2 0 7
3 6 7 2 1 6 5 4 3 6 7 2 1 0 5 4
2 3 4 8 2 8 6 1 0 3 4 0 2 8 6 1
4 1 6 5 7 7 3 5 -> 4 1 0 5 7 0 3 0
7 2 3 1 8 5 1 2 7 0 3 0 8 5 1 2
3 5 6 7 3 1 8 4 0 5 6 7 0 1 8 0
6 4 2 3 5 4 7 8 6 0 2 3 5 4 7 8
8 7 1 4 2 3 5 6 8 7 1 4 0 3 0 6
9
8 6 5 6 8 1 2 2 9 8 0 5 6 0 1 2 0 9
5 6 2 4 1 7 9 8 3 5 6 2 4 1 7 9 8 3
5 8 2 5 9 9 8 2 6 0 8 0 5 0 9 0 2 0
9 5 6 6 4 3 8 4 1 9 5 6 0 4 3 8 0 1
1 1 6 3 9 9 5 6 2 -> 0 1 0 3 9 0 5 6 2
1 1 4 7 3 8 3 8 6 1 0 4 7 0 8 3 0 6
3 7 4 1 2 6 4 5 5 3 7 0 1 2 6 4 5 0
3 3 1 9 8 7 7 4 5 0 3 1 9 8 0 7 4 5
2 9 7 5 3 5 9 1 3 2 9 7 0 3 5 0 1 0
Estos casos de prueba están tomados de Concept Is Puzzles , PuzzleBooks , Concept Is Puzzles , Wikipedia y Youtube , respectivamente.
Especificaciones
No necesita preocuparse por el manejo de excepciones.
Usted puede asumir que la entrada es siempre un rompecabezas válida con una única solución y se puede tomar ventaja de esto en la escritura de su código.
Este es el código de golf , gana el menor número de bytes.
4 <= n <= 9 (16 originalmente, cambiado a 9 siguiendo la sugerencia de Stewie Griffin, también ahorra algunos problemas en IO)
Puede tomar datos y proporcionar resultados a través de cualquier formulario estándar , y puede elegir el formato.
Algunas sugerencias para el formato de salida son (pero no está restringido a estas)
- Salida de la grilla final
- Salida de la cuadrícula que contiene todos los números eliminados
- Salida de una lista de coordenadas de uno de los anteriores
Como de costumbre, las lagunas predeterminadas se aplican aquí.
Relacionado (inspirado en este desafío): compruebe si todos los elementos de una matriz están conectados
Mi último desafío: extensión del juego de los sietes
4 <= n <= 16
, pero el caso de prueba más grande es paran=9
. Le sugiero que publique unn=16
caso de prueba o diga4 <= n <= 9
. Bonito desafío por cierto :)Respuestas:
Haskell , 374 bytes
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , 133 bytes SBCS
Pruébalo en línea!
Mi implementación de la regla n. ° 4 (las celdas deben formar un único componente conectado) es un desperdicio, pero aún así, pasa todas las pruebas en aproximadamente 10 segundos en TIO.
El algoritmo general: Almacene dos matrices booleanas
b
yw
para celdas que seguramente serán en blanco y negro, respectivamente. Inicializarb
como todo cero. Inicialicew
como 1 solo para aquellas celdas que tienen vecinos coincidentes opuestos.Repita hasta
b
yw
calme:agregar a
b
celdas que están en la misma línea (horizontal o vertical) y del mismo valor que una celda enw
agregar a
w
los vecinos inmediatos de todas las celdas enb
agregar a
w
todos los puntos de corte: celdas cuya eliminación dividiría el gráfico de celdas no negras en múltiples componentes conectadosFinalmente, salida
not(b)
multiplicada por la matriz original.fuente
Jalea , 62 bytes
Utiliza el enlace monádico isConnected de user202729 de otra pregunta.
Un programa completo que imprime una representación de una lista de listas.
Funciona por fuerza bruta y es estúpidamente ineficiente.
Pruébalo en línea! - un 3 por 3, ya que es demasiado ineficiente ejecutar incluso un tamaño 4 dentro del límite TIO de 60 segundos.
¿Cómo?
fuente