Totalmente sorprendido de que esto no se haya publicado ya, dada la gran cantidad de rompecabezas de ajedrez en el sitio. Mientras pensaba en esto, agradezco a Anush por publicarlo en la caja de arena en marzo . Pero pensé que había pasado el tiempo suficiente para poder seguir adelante y hacerlo yo mismo.
Un jaque mate en ajedrez es una posición en la que el rey es atacado y no hay movimiento que pueda defenderlo. Si no está familiarizado con cómo se mueven las piezas de ajedrez, puede familiarizarse con Wikipedia .
El reto
Para este desafío, su entrada será la posición de un tablero de ajedrez en la notación que desee. Para aclarar, su entrada describirá las piezas en un tablero de ajedrez, con sus colores y posiciones, junto con el posible cuadro de captura pasajero , si lo hay. (La capacidad de castillo es irrelevante, ya que no puede hacerlo fuera de control). Puede encontrar útil la notación FEN , pero cualquier formato conveniente está bien. Por simplicidad, puedes asumir que es negro para jugar , esto significa que el negro siempre será el jugador de jaque mate. Una posición en la que las blancas estén en jaque, jaque mate o estancadas se considerará inválida para este desafío.
Debe generar un valor verdadero si la posición es jaque mate, y un valor falso si no lo es. Tenga en cuenta que el punto muerto no es jaque mate : ¡el rey debe ser atacado!
Casos de prueba de verdad
1k5R / 6R1 / 8/8/8/8/8 / 6K1 b - -
rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / R3K2R b - -
kr5R / rB6 / 8/8/8 / 5Q2 / 6K1 / R7 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / R3r2k b - - 0 1
Casos de prueba de Falsey
rnbqkbnr / pppppppp / 8/8 / 4P3 / 8 / PPPP1PPP / RNBQKBNR b KQkq -
8/8/8/8/8 / 1KQ5 / 4N3 / 1k6 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / 4r2k b - -
8/8 / 2Q5 / 3k4 / 3Q5 / 8/8 / 7K b - -
8 / 4Q1R1 / R7 / 5k2 / 3pP3 / 5K2 / 8/8 b - e3 (¡Cuidado con eso!)
Código de golf: el código más corto en bytes gana. ¡Buena suerte!
fuente
Respuestas:
JavaScript (Node.js) ,
499 ... 374370 bytes(b)(X)
A continuación se muestran los valores esperados para cada cuadrado:
Pruébalo en línea!
¿Cómo?
Representación de la junta
Utilizamos la representación clásica de tablero 0x88 , para que los cuadrados objetivo fuera de los límites se puedan detectar fácilmente.
Mover codificación
Cada conjunto de movimientos está codificado con 5 parámetros:
Todos estos parámetros están empaquetados en una sola cadena. Por ejemplo, los movimientos de caballeros se codifican de la siguiente manera:
lo que da:
Todos los conjuntos de movimientos se resumen en la siguiente tabla, excepto las capturas pasantes que se procesan por separado.
Comentado
fuente
8/1ppp4/1pkp4/8/2Q5/8/8/7K b - -
Haskell ,
116510651053 bytesBytes guardados gracias a Leo Tenenbaum
Pruébalo en línea!
Por el momento, esto no está exactamente bien, pero es un comienzo.Con algo de ayuda en el camino, ahora he jugado golf de manera bastante agresiva (y solucioné un error en el camino).Lo más cuestionable que esto hace es que supone que, aparte de un rey o un peón al paso, nunca puedes salir de control capturando una de tus propias piezas. En el ajedrez no tienes permitido hacer este movimiento, pero mi programa considera estos movimientos para guardar bytes bajo el supuesto de que si estás en control, esto nunca podrá sacarte de allí.
Esta suposición es válida porque tales movimientos
No se puede capturar la pieza que está atacando al rey, ya que la pieza que capturan es negra.
No se puede bloquear el camino de la pieza que está atacando al rey, ya que la pieza negra capturada ya habría estado haciendo eso.
También agregamos la estipulación adicional de que si no tienes un rey estás bajo control.
Este programa también supone que si hay un peón que se puede capturar de pasada, entonces el peón fue la última pieza en moverse y ese movimiento fue legal. Esto se debe a que el programa no comprueba si el cuadrado al que mueve el peón negro está vacío, por lo que si hay una pieza, las cosas pueden ponerse un poco complicadas. Sin embargo, esto no se puede obtener si el último movimiento fue legal y, además, no se puede representar en FEN . Entonces esta suposición parece bastante sólida.
Aquí está mi versión "sin golf" para referencia:
Pruébalo en línea!
fuente
guard x = [0|x]
y también puede usarx?y=Just(x,y)
para guardar algunos bytes más: 1129 bytesPython 3 (PyPy) , 729 bytes
Pruébalo en línea!
fuente
8/2p5/Q7/Q2k4/Q7/8/8/7K b - -
(no jaque mate).