Dada una cuadrícula de letras de 8x8 que representa el estado actual de un juego de ajedrez, la tarea de su programa es encontrar un próximo movimiento para las blancas que resulte en jaque mate (la respuesta siempre será compañero en un movimiento).
Entrada
La entrada estará en STDIN: 8 líneas de 8 caracteres cada una. Los significados de cada personaje son los siguientes:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Las letras mayúsculas representan piezas blancas y las minúsculas representan negro. El tablero estará orientado de modo que el blanco se juegue desde abajo y el negro desde arriba.
Salida
Un movimiento para el blanco que resulta en jaque mate, en notación algebraica . No necesita anotar cuándo se ha tomado una pieza, ni debe preocuparse por la desambiguación entre dos piezas idénticas que pueden hacer el mismo movimiento.
Entrada de muestra
Ejemplo 1
Entrada:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Salida:
c6
Ejemplo 2
Entrada:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Salida:
Nf5
Ejemplo 3
Entrada:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Salida:
Rh5
Puede suponer que la solución no implicará enroque o pasajero.
Este es el código de golf: la solución más corta gana.
(Ejemplos tomados de mateinone.com - rompecabezas 81, 82 y 83)
Respuestas:
Ruby,
589512510499493 caracteresLa entrada se proporciona a través de stdin, por ejemplo:
La salida no es solo un movimiento que fuerza a un compañero en uno, sino cada movimiento que lo hace.
Edición 1: la función
e
se usó solo una vez, así que la alineé. En segundo lugar, la codificación ahora se basa en el número 5 en lugar de 10. Y refactorizar la clonación del tablero ahorró bastantes caracteres.Edición 2: Todavía no hay tanta mejora como quería. Cambiar el hash de
{a=>b,c=>d}
aHash[a,b,c,d]
. Esto cuesta 4 caracteres pero ahorra uno por par clave-valor.Edición 3: Solo reducciones menores: alineando M (4 caracteres),
t==?-
->t<?.
(2), eliminando Peón en notación algebraica al final (2), reemplaza put (3). El programa ahora tiene menos de 500 caracteres.Edición 4: es interesante cuánto se puede encontrar en un programa de este tipo. Movió un invariante fuera del ciclo y encontró otro cálculo duplicado.
fuente
[*$<]
lugar de$<.map{|l|l}
.