0h n0 es un juego muy simple y divertido, un poco como Sudoku o buscaminas.
Reglas del juego
(Recomiendo usar el tutorial en el juego si puedes, es muy simple y útil)
El rompecabezas comienza con un n * n
tablero que contiene algunas piezas fijas y algunas celdas vacías, y el solucionador debe encontrar una manera de llenar las celdas vacías con piezas y satisfacer todas las restricciones impuestas por las piezas fijas. Estos son los tipos de piezas que utilizaremos con la abreviatura:
#
Pieza roja (bloquea la vista de una pieza azul)O
Pieza azul.
Lugar vacíonumber
Pieza azul numerada (number
es un número de un dígito> 0)
Todas las piezas numeradas deben ver exactamente la misma cantidad de piezas azules que el número. Por ejemplo:
#1O#O
...O.
La 1
pieza solo puede ver otra pieza azul.
Cómo se ven las piezas
Dos piezas azules se pueden ver si están en la misma fila o columna y no hay una pieza roja entre ellas. Ejemplo:
( S
es una ubicación que la O
pieza puede ver, X
no se puede ver)
S
S
X#SOSS
#
X
Cada pieza azul debe ver al menos otra pieza azul:
#O#
No funcionará, pero:
#OO
O:
###
Hacer trabajo.
Tablero de demostración resolver
.1..
..1.
....
22#2
La parte inferior derecha 2 solo puede ver por encima de sí misma, por lo que debe ser azul y la parte superior derecha debe ser roja.
.1.#
..1O
...O
22#2
Como 1
está lleno, podemos rodearlo con piezas rojas.
.1##
.#1O
..#O
22#2
La parte superior izquierda 1
solo puede ver en una dirección ahora, por lo que podemos completarlo.
O1##
.#1O
..#O
22#2
Ahora sobre esos últimos 2
s. Podemos poner 2 piezas azules sobre ellas.
O1##
.#1O
OO#O
22#2
El último estará lleno de #
O1##
##1O
OO#O
22#2
Entrada
La entrada es una cadena de varias líneas. El tamaño será 9x9
sin espacio final. Tiene los siguientes tipos de piezas:
.
Vacío#
Rojo preestablecido, no se puede cambiarnumber
Número preestablecido, no se puede cambiar
(Tenga en cuenta que el azul nunca estará en la entrada)
Salida
La salida es lo mismo que la entrada, con el cambio de que empty ( .
) se reemplaza con rojo o azul para resolver el tablero, y los números se reemplazan con piezas azules ( O
).
Ejemplos
(Tenga en cuenta que pueden ser posibles varias soluciones para cada rompecabezas, pero solo necesita mostrar una de ellas)
Input:
........4
...3.1...
45...2.3.
..9......
1..6#44..
....4..5.
....4.36.
2.......6
1....4...
Output:
OOO###OOO
OOOO#O#OO
OOO#OO#OO
#OOOO#O##
O#OO#OOOO
O#OOOO#OO
#OOOO#OOO
OO#O#OOOO
O#OOOO#O#
Input:
..7..#...
#...8..11
2....5...
..5...48.
...#...4.
.5...6...
...1.2...
2.....6.8
.7..#....
Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O
Input:
5.3..33..
...4...23
.6.6.34..
...3#....
....5..4.
.5....3..
7.98.6#.3
.5.6..2..
..6...2..
Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O
¡Gracias a @PeterTaylor y @apsillers por toda su ayuda en el sandbox!
fuente
Respuestas:
Haskell, 224 bytes
No completamente probado, porque es muy lento (al menos
O(n*2^n^2)
).Explicación:
La idea básica es representar un tablero de
Red, Blue
piezas como una lista de listas de0, 1
, donde la lista de listas se empaqueta en un solo entero para una enumeración más fácil. Todos estos enteros para el tamaño del tablero se generan y se convierten en un formulario con recuentos de vecinos. Se devuelve la primera placa de este tipo que es una solución válida de la entrada.La parte que probablemente podría ser más golfed es:
and.map and$zipWith(zipWith(%))
. De lo contrario, detecté algunos errores fuera de uno que agregaron longitud y probablemente podrían jugar más.fuente