Recientemente, me presentaron un juego de rompecabezas conocido como Solitaire Chess . Resumiré las reglas aquí:
- El tablero es un tablero de ajedrez 4x4.
- Todas las piezas son del mismo color (sin equipos) y todas las piezas pueden capturar cualquier otra pieza.
- Cada movimiento debe ser una captura. No moverse a cuadrados vacíos.
- Debe haber exactamente una pieza restante al final.
- Todas las piezas se mueven exactamente como lo hacen en el ajedrez, con una modificación: el peón puede capturar en cualquier dirección diagonal (lo que técnicamente lo convierte en un ferz ). Para beneficio de aquellos que quizás no sepan, he incluido diagramas de movimiento.
- Ninguna de las otras reglas del ajedrez (como el cheque, el enroque, etc.) se aplica aquí. Se trata de capturas.
Rey (K)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Reina (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Torre (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Obispo (B)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Caballero
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Peón (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
De entrada y salida
Como referencia, se utilizará el ejemplo de rompecabezas de la página web Solitaire Chess:
. . . .
. B . .
R P . .
. . . N
La solución es tomar el peón con el caballero, luego tomar el caballero con la torre, y finalmente tomar el alfil con la torre.
Entrada
La entrada debe estar en una de tres formas; Usted es libre de elegir el que sea más conveniente para usted.
- Una cadena de caracteres como
.....B..RP.....N
, con o sin líneas nuevas. El personaje que representa un espacio en blanco puede ser cualquier personaje que no sea uno de ellosKQRBNP
. - Una lista de listas (o una lista aplanada) donde los elementos son caracteres o números, así:
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
o[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
. Para el primero, el personaje que representa un espacio en blanco puede ser cualquier cosa que no sea unoKQRBNP
. Para este último, he dado a las piezas el número que corresponde a su rango en mi lista anterior de movimientos (1
es un rey,4
es un obispo,6
es un peón, etc.). Eres libre de cambiar la numeración. - Una lista de coordenadas en donde cada elemento tiene la forma
[x, y, 'c']
, así:[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
.
Si elige uno de los formatos de entrada basados en listas, los separadores y delimitadores pueden ser caracteres razonables y comprensibles.
Salida
La salida debe ser una secuencia de movimientos o una secuencia de estados del tablero. Algunos rompecabezas tienen más de una solución; puede generar uno o todos ellos. Si elige generar una secuencia de estados de placa, cada placa debe estar en uno de los tres formatos de entrada, con un separador razonable (como líneas nuevas) entre ellas.
Si decide que genere una secuencia de movimientos, que deben expresarse como una lista de pares de pares de coordenadas, así: [[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
. [0,0]
representa la esquina inferior izquierda, y nuevamente, separar y delimitar caracteres puede ser una opción razonable.
Si no se puede resolver una placa determinada, envíe un valor falso ( 0
, cadena vacía, etc.). Si un tablero dado tiene menos de dos piezas, el comportamiento es indefinido.
Casos de prueba
Nota: las salidas solo se dan como una lista de pares de coordenadas, ya que los otros formatos deberían ser bastante fáciles de verificar para su corrección (y no tenía ganas de escribir todos los formatos de salida posibles). Además, para los acertijos que tienen más de una solución, solo se ofrece una posibilidad.
Entrada 1:
. . . N
. . . .
. R . .
. . B .
...N.....R....B.
[['.', '.', '.', 'N'], ['.', '.', '.', '.'], ['.', 'R', '.', '.'], ['.', '.', 'B', '.']]
[[0, 0, 0, 5], [0, 0, 0, 0], [0, 3, 0, 0], [0, 0, 4, 0]]
[[3, 3, 'N'], [1, 1, 'R'], [2, 0, 'B']]
Salida 1:
[[[2,0], [1,1]], [[1,1], [3,3]]]
Entrada 2:
. . . .
. B . .
R P . .
. . . N
.....B..RP.....N
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
Salida 2:
[[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
Entrada 3:
. N R .
B . . .
N . . B
. . P .
.NR.B...N..B..P.
[['.', 'N', 'R', '.'], ['B', '.', '.', '.'], ['N', '.', '.', 'B'], ['.', '.', 'P', '.']]
[[0, 5, 3, 0], [4, 0, 0, 0], [5, 0, 0, 4], [0, 0, 6, 0]]
[[1, 3, 'N'], [2, 3, 'R'], [0, 2, 'B'], [0, 1, 'N'], [3, 1, 'B'], [2, 0, 'P']]
Salida 3:
[[[2,0], [3,1]], [[0,1], [1,3]], [[0,2], [1,3]], [[2,3], [1,3]], [[3,1], [1,3]]]
Entrada 4:
. . . N
. . . R
R B B .
N P P .
...N...RRBB.NPP.
[['.', '.', '.', 'N'], ['.', '.', '.', 'R'], ['R', 'B', 'B', '.'], ['N', 'P', 'P', '.']]
[[0, 0, 0, 5], [0, 0, 0, 3], [3, 4, 4, 0], [5, 6, 6, 0]]
[[3, 3, 'N'], [3, 2, 'R'], [0, 1, 'R'], [1, 1, 'B'], [2, 1, 'B'], [0, 0, 'N'], [1, 0, 'P'], [2, 0, 'P']]
Salida 4:
[[[2,1], [3,2]], [[1,1], [3,3]], [[3,2], [1,0]], [[3,3], [0,0]], [[0,1], [0,0]], [[0,0], [1,0]], [[1,0], [2,0]]]
Entrada 5:
P . . .
. R . .
R . R .
. R . .
P....R..R.R..R..
[['P', '.', '.', '.'], ['.', 'R', '.', '.'], ['R', '.', 'R', '.'], ['.', 'R', '.', '.']]
[[6, 0, 0, 0], [0, 3, 0, 0], [3, 0, 3, 0], [0, 3, 0, 0]]
[[0, 3, 'P'], [1, 2, 'R'], [0, 1, 'R'], [2, 1, 'R'], [1, 0, 'R']]
Salida 5:
[[[0,3], [1,2]], [[1,2], [2,1]], [[2,1], [1,0]], [[1,0], [0,1]]]
Entrada 6:
. P . N
K . . .
. . B .
. . R Q
.P.NK.....B...RQ
[['.', 'P', '.', 'N'], ['K', '.', '.', '.'], ['.', '.', 'B', '.'], ['.', '.', 'R', 'Q']]
[[0, 6, 0, 5], [1, 0, 0, 0], [0, 0, 4, 0], [0, 0, 3, 2]]
[[1, 3, 'P'], [3, 3, 'N'], [0, 2, 'K'], [2, 1, 'B'], [2, 0, 'R'], [3, 0, 'Q']]
Salida 6:
[[[3,0], [2,0]], [[2,0], [2,1]], [[3,3], [2,1]], [[2,1], [1,3]], [[0,2], [1,3]]]
[["R", [2, 0], [1, 1]], ["N", [1, 1], [3, 3]]]
Respuestas:
Haskell,
226195191188 bytesDevuelve una lista de todas las soluciones. Cada solución es una lista de movimientos. Devuelve una lista vacía si no hay solución.
Guardado 4 bytes Gracias a Lynn.
Pruébalo en línea
Uso:
Salida:
fuente
!
algunos bytes:f l=[(i,j):r|(i@(s,t),a)<-l,(j@(u,v),_)<-l%i,r<-f$(j,a):l%i%j,(s-u)^2+(t-v)^2`elem`m a]
[[((2,0),(1,1)),((1,1),(3,3))]]
. Una lista de soluciones, donde una solución es una lista de movimientos, donde está un movimiento((x1,y1),(x2,y2))
.m"P"=[1]
¿No debería ser 2?Javascript (ES6),
372361358 bytes(Todavía) necesita algo de optimización. Pero aquí hay un
primersegundointento tercero.Formato de salida:
Ejemplo:
fuente