Es el final de otro juego de ajedrez bien jugado. Eres el jugador blanco, y todavía tienes una torre y tu rey. A tu oponente solo le queda su rey.
Como eres blanco, es tu turno. Crea un programa para jugar esta partida de ajedrez. Su salida puede ser una secuencia de movimientos, una animación gif, arte ASCII o lo que quieras.
Parece bastante obvio, pero lo declararé explícitamente: tienes que ganar el juego (en un número finito de movimientos). Siempre es posible ganar desde esta posición. No pierdas ese libro. NO ESTEALMATE.
Su programa puede o no aceptar una entrada humana para la posición inicial y para cada movimiento negro (puede asumir con seguridad que esta es una posición legal, es decir, los reyes no se tocan entre sí). Si no es así, una posición inicial aleatoria y movimientos aleatorios para el rey negro serán suficientes.
Puntuación
Su puntaje será la longitud en bytes de su código + bono. Se permite cualquier idioma, gana la puntuación más baja.
Prima
-50 si su programa permite tanto una posición inicial definida por el ser humano como una aleatoria. Los humanos pueden ingresar a través de stdin, archivo, GUI ...
-100 si su programa permite que un jugador humano y uno aleatorio muevan al rey negro
+12345 si confía en un solucionador de ajedrez externo o una biblioteca de ajedrez incorporada
¡Buena suerte!
¡Actualizar!
Regla adicional: el partido debe jugarse hasta el jaque mate. Black no renuncia, no salta fuera del tablero de ajedrez y no es secuestrado por extraterrestres.
Insinuación
Probablemente pueda obtener ayuda de esta pregunta en chess.se .
Respuestas:
Haskell 1463-100 = 1363
Solo obtengo una respuesta. Esto encuentra la solución de manera retrógrada, trabajando desde jaque mate hasta la posición en la que estamos. Difiere de la descripción del análisis retrógrado en la programación de ajedrez , en lugar de comenzar con un conjunto inicial y expandirlo con movimientos hacia atrás hasta que no se haya visto ningún cuadro movido, comienza con todos los cuadrados no utilizados y reduce ese conjunto al intentar avanzar. Esto será menos eficiente en tiempo que la forma tradicional, pero el uso de memoria explotó cuando lo probé.
Compilar con
ghc -O2
un rendimiento aceptable para el cálculo de la tabla final; El juego es instantáneo después del primer movimiento. Proporcione rey blanco, torre, cuadrados de rey negro como argumentos. Para un movimiento, solo quiere un cuadrado, y elegirá uno para ti si presionas Intro. Sesión de ejemplo:Código:
Editado: Se corrigió el código para recordar la tabla del final del juego y usar argumentos, mucho menos doloroso para probar repetidamente.
fuente
y
). Esto es realmente obvio porque el segundo movimiento no es rápido cuando ya hemos considerado todo el final del juego. Esta noche voy al pub, pero si tengo la oportunidad mañana, lo haré menos terrible.C, actualmente 2552 caracteres sin espacios en blanco sin comentarios
El conteo me indica que podría jugar menos de 2552 caracteres en total, pero dado que ya hay una respuesta más pequeña (que será difícil de superar), lo consideraré cuidadosamente antes de molestarme en hacerlo. Es cierto que hay alrededor de 200 caracteres para mostrar el tablero y otros 200 para verificar la entrada del usuario tanto de la posición inicial como del movimiento (que necesito para probar, pero podría eliminar).
No hay árbol de juego aquí, solo algoritmo codificado, por lo que se mueve al instante.
Las posiciones de inicio se ingresan como fila (1-8) columna (1-8) numeradas desde la parte superior derecha y el programa funciona en el mismo esquema. Entonces, si giró la pantalla 90 grados en sentido antihorario, seguiría la notación cuadrática numérica del Ajedrez por correspondencia estándar. Las posiciones donde el rey negro ya está bajo control son rechazadas como ilegales.
Los movimientos negros se ingresan como un número del 0 al 7, siendo 0 un movimiento hacia el norte, 1 hacia el noreste y así sucesivamente en sentido horario.
No sigue el algoritmo comúnmente conocido que usa exclusivamente la torre bajo la protección del rey blanco para restringir al rey negro. La torre solo restringe al rey negro en sentido vertical (y se escapará horizontalmente si es perseguido). El rey blanco restringe al rey negro en movimiento horizontal. Esto significa que las dos piezas blancas no se interponen entre sí.
Parece que he solucionado la mayoría de los errores y posibles bucles infinitos, ahora funciona bastante bien. Mañana volveré a jugar con él y veré si hay algo más que deba arreglarse.
Aquí hay un acabado típico (el mate a veces puede ocurrir en cualquier lugar en el borde derecho o izquierdo del tablero).
fuente
Bash, 18 (o -32?)
Bien, esta es una respuesta de broma. Como el negro es un buen jugador de ajedrez, y el negro sabe que el blanco también es un buen jugador de ajedrez, decide que lo único sensato es:
Esto da como resultado la victoria blanca, que cumple con las especificaciones.
Técnicamente, también puede ingresar las posiciones actuales como argumentos, el programa simplemente los ignora, por lo que podría decirse que esto puede calificar para el bono de -50.
fuente
1-0
un resultado un poco más corto.