El programa juega blanco.
Ejemplo stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Ejemplo stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Cualquier movimiento válido está bien. "En passant" y enroque son ignorados. Está bien mostrar mensajes de error o no imprimir nada si no hay un movimiento válido.
La respuesta con más votos gana.
popularity-contest
chess
Hristo Hristov
fuente
fuente
Respuestas:
No me estoy quejando de los votos, pero para ser justos ... mi solución aquí no es realmente tan buena. Ugoren es mejor, aparte de la falta de soporte Unicode. ¡Asegúrese de ver todas las respuestas antes de votar, si se ha encontrado con esta pregunta solo ahora!
De todas formas.
Haskell, 893
888904952(sin enrocar)862 (sin peones dobles movimientos)(No especificó si se supone que esto es código golf, pero me parece que debería)
Cuando tiene instalado GHC (por ejemplo, como parte de la plataforma Haskell ) puede hacer solo
fuente
C,
734672640 caracteresCaracteres contados sin espacios en blanco extraíbles.
El formato de archivo que utilicé no es el solicitado, sino ASCII simplificado.
Necesito agregar soporte de caracteres Unicode, costaría algunos characets.
Formato de archivo de entrada / salida:
debe tener exactamente 8 líneas de exactamente 8 caracteres.
pnbrqk
se utilizan para piezas blancas,PNBRQK
para piezas negras, espacios para espacios:La lógica es bastante simple:
para cada posible movimiento de cada pieza blanca, intente cada posible movimiento de cada pieza negra.
Si ningún movimiento negro captura al rey blanco, el movimiento blanco es válido.
El tablero se mantiene como
char[256]
, tratado como una matriz de 16x16, donde solo se usa el 8x8 superior izquierdo. Las posiciones y los vectores de movimiento se mantienen en enteros de 8 bits (x:4,y:4
). El bit extra permite usar aritmética simple (new_pos = old_pos + steps*direction
), con detección fácil del borde del tablero (&0x88
hace la magia).r[]
codifica tres cosas:'('+vector
.Funciones:
main
lee el tablero, convierte letras en código interno, llamaa
para encontrar movimientos blancos, imprime el tablero.a
recorre recursivamente los 64 cuadrados. Para cada pieza del color correcto (parámetroc
), encuentra la regla de movimiento para la pieza y llamad
.d
recorre recursivamente la regla de movimiento codificada, que es una lista de vectores, que llamae
a cada uno. Dae
la posición original, el vector y el límite de rango (7 para piezas por encima de B, 2 para peones de segundo rango, 1 de lo contrario).e
prueba todos los movimientos a lo largo de un vector. Si el movimiento es posible (es decir, los peones se mueven hacia adelante, dentro del tablero, no bloqueados, la captura de peones en diagonal), verifica una de dos cosas. Para movimientos blancos, correv
para validar el movimiento. Para movimientos negros, verifica si el rey blanco es capturado. Si es cierto, el movimiento se juega en el tablero.v
valida un movimiento blanco. Copia el tablero a un lado, ejecuta el movimiento para probar ya
vuelve a llamar para buscar movimientos negros.fuente
Python 2.6,
886- 1425 caracteresMi versión inicial (en las revisiones) llegó a 886 caracteres, pero no satisfizo completamente la especificación (no comprobó para evitar el jaque mate; ni siquiera consideró los posibles movimientos de las piezas negras).
Ahora sí (y he solucionado varios errores en el original). Por desgracia, esto tiene un costo en caracteres: 1425 por ahora, pero aún debería haber poco margen de mejora. Esta versión debería ser mucho más sólida en el manejo de casos extremos que la anterior.
Ejemplo de entrada y salida:
fuente