Peg Solitaire es un juego popular que generalmente se juega solo. El juego consiste en un cierto número de clavijas y un tablero que se divide en una cuadrícula; por lo general, el tablero no es rectangular, pero para este desafío asumiremos que sí.
Cada movimiento válido le permite a uno eliminar una sola clavija y el objetivo es jugar de una manera, de modo que quede una sola clavija. Ahora, un movimiento válido tiene que estar en una sola dirección (norte, este, sur u este) y saltar sobre una clavija que se puede quitar.
Ejemplos
Deje .
espacios vacíos en el tablero y los números son clavijas, el siguiente movimiento se moverá 1
uno hacia la derecha y se eliminará 2
del tablero:
..... .....
.12.. -> ...1.
..... .....
Un movimiento siempre tendrá que saltar sobre una sola clavija, por lo que lo siguiente no es válido:
...... ......
.123.. -> ....1.
...... ......
Aquí hay algunas configuraciones válidas después de un movimiento cada una:
...1... ...1... ..71... ..71...
.2.34.5 ---> .24...5 ---> .2....5 ---> ......5
.678... (4W) .678... (7N) .6.8... (2S) ...8...
....... ....... ....... .2.....
Desafío
Dada una configuración inicial de la placa y alguna otra configuración, indique si se puede alcanzar la otra configuración moviendo sucesivamente las clavijas como se describió anteriormente.
Reglas
- De entrada será una matriz / lista de listas / ... de valores que indican un espacio vacío (por ejemplo. Cero o falsa) o clavijas (por ejemplo. No cero o verdadero)
- se puede suponer y
- puede usar verdadero / distinto de cero para indicar espacios vacíos y viceversa si ayuda
- La salida será dos valores distintos (uno de los valores puede diferir) que indican si se puede alcanzar la configuración final (por ejemplo, falsedad / verdad ,
[]
/[list of moves]
..)
Casos de prueba
initial goal -> output
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,0],[0,1,0],[1,1,0]] -> True
[[1,0,0],[1,1,0],[0,1,0]] [[0,0,1],[0,1,1],[0,0,0]] -> False
[[0,0,0],[1,0,0],[0,0,0]] [[0,0,0],[0,0,1],[0,0,0]] -> False
[[0,0,0],[1,1,0],[0,0,0]] [[0,0,0],[0,1,1],[0,0,0]] -> False
[[0,0,0,0],[1,1,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,1],[0,0,0,0]] -> False
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[0,0,1],[0,1,0],[1,0,0],[0,0,1]] -> True
[[1,0,0],[1,1,0],[1,1,1],[1,1,1]] [[1,0,0],[0,0,0],[0,0,0],[0,0,0]] -> False
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,1,0],[1,0,0,0],[1,0,1,0],[1,0,0,1]] -> True
[[1,0,1,1],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> False
[[1,0,0,0],[1,1,0,0],[1,1,1,0],[1,0,1,0]] [[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]] -> True
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]] -> False
[[0,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,0]] [[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] -> False
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,0,1,0,0,0],[0,1,0,1,1,0,1],[0,1,1,1,0,0,0],[0,0,0,0,0,0,0]] [[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,1,0,0,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] -> True
[[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[1,1,1,1,1,1,1],[1,1,1,0,1,1,1],[1,1,1,1,1,1,1],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0]] [[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] -> True
7
en tu ejemplo? ¿Por qué desaparece después de2
moverse hacia el sur?Respuestas:
JavaScript (ES6),
184 178173 bytes(initial_board)(target_board)
Pruébalo en línea!
(eliminó los dos últimos casos de prueba que toman demasiado tiempo para TIO)
Comentado
fuente
Limpio , 232 bytes
Pruébalo en línea!
Esta es una de las raras ocasiones en que puedo utilizar composición y curry mientras guardo bytes.
Explicado:
@ :: [Int] -> [[Int]]
es una función auxiliar que se utiliza para generar los diferentes potenciales nuevas filas / columnas que podrían resultar de un movimiento que se hizo. Evita la necesidad de un caso especial[1,1,0:_]
al notar esoa*b-c>0
solo cuando[a,b,c]=[1,1,0]
, y así lotake(a*b-c)...
hace[]
al tomar-1
o0
elementos para todas las configuraciones que no son un movimiento válido.flip elem o...
invierte el orden de los argumentos aelem
(haciéndolo "si x contiene una y" en lugar de "es x un miembro de y") y aplica la función anónimac
al primer argumento.\c=limit(iterate(nub o concatMap ...)[c])
genera todos los tableros potenciales que pueden resultar de lac
unión al conjunto actual de tableros con todos los movimientos que pueden ocurrir en todos los tableros y elimina los duplicados, hasta que el resultado deja de cambiar.\l=[l]++...
antepone el tablerol
a la lista de todos los tableros nuevos potenciales a una distancia de un movimiento, generado al aplicar@
a las filas de cada orientación del tablero (rotaciones de 0, 90, 180, 270 grados) y reemplazar la fila cambiada correspondiente con el nuevo fila.fuente