El reto
Escriba un programa o función que tome una entrada de cadena como parámetro de función o desde stdin y determine si es una cadena FEN válida .
Entrada
Puede suponer que la entrada solo incluirá los siguientes caracteres (mayúsculas y minúsculas)
pkqrbnPKQRBN12345678/
La longitud de la entrada siempre será un mínimo de 1 carácter y un máximo de 100 caracteres.
Salida
La salida debe ser un valor verdadero / falso. Estos pueden ser los valores que desee siempre que sean consistentes (todos los resultados verdaderos tienen la misma salida, todos los resultados falsey tienen la misma salida). Debe tener exactamente dos salidas posibles distintas.
Lo que cuenta como válido
Las letras minúsculas representan piezas negras, las letras mayúsculas representan piezas blancas.
Debes asegurarte de que es posible en un juego de ajedrez que existan las piezas en la posición actual.
Cada jugador siempre tendrá exactamente 1 rey (k / K)
Cada jugador puede tener no más de 8 peones (p / P)
Cada jugador generalmente no tendrá más de 1 * reina (q / Q)
Cada jugador generalmente no tendrá más de 2 * torres (r / R)
Cada jugador generalmente no tendrá más de 2 * caballeros (n / N)
Cada jugador generalmente no tendrá más de 2 * obispos (b / B)
* Es legal que un jugador ' promueve 'un peón a cualquiera de estas cuatro piezas.
El total de peones, reinas, torres, caballeros y obispos para cada jugador nunca será más de 15
El número total de piezas más los cuadrados vacíos (indicados por números) siempre debe sumar exactamente 8 para cada rango. Y siempre debe haber exactamente 8 rangos, separados por una barra diagonal.
Cosas que puedes ignorar
No necesita preocuparse por si es posible o no jugar en la posición indicada, o si la posición es legal, solo si las piezas pueden existir en las cantidades indicadas.
Puede ignorar otras complejidades de las cadenas FEN, como el turno de jugador, los derechos de enroque y al pasar.
Este es el código de golf. El programa más corto en bytes gana. Se aplican las lagunas y reglas habituales.
Casos de prueba
Entrada rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR
Salida Verdadero
Entrada 2br2k1 / 1p2n1q1 / p2p2p1 / P1bP1pNp / 1BP2PnP / 1Q1B2P1 / 8 / 3NR2K
Salida Verdadero
Entrada r2r2k1 / p3q2p / ppR3pr / rP4bp / 3p4 / 5B1P / P4PP1 / 3Q1RK1
Salida False
(el negro tiene 7 peones y 4 torres - imposible)
Entrada 6k1 / pp3ppp / 4p3 / 2P3b1 / bPP3P1 / 3K4 / P3Q1q1
Salida False (solo 7 rangos)
Entrada 3r1rk1 / 1pp1bpp1 / 6p1 / pP1npqPn / 8 / 4N2P / P2PP3 / 1B2BP2 / R2QK2R
Salida False (9 rangos)
Entrada 5n1k / 1p3r1qp / p3p3 / 2p1N2Q / 2P1R3 / 2P5 / P2r1PP1 / 4R1K1
Salida False (2do rango tiene 9 cuadrados / piezas)
Entrada rnbqkbnr / pppppppp / 8/35/8/8 / PPPPPPPP / RNBQKBNR
Salida Verdadero
Gracias a Feersum y Arnauld por aclarar este caso (3 + 5 = 8)
¿Qué es el FEN?
FEN es una notación estándar para registrar la posición de las piezas en un tablero de ajedrez.
Crédito de imagen http://www.chessgames.com
fuente
* It is legal for a player to 'promote' a pawn to any of these four pieces.
El jugador puede tener hasta 9 reinas siempre que se reduzca el número de peones para compensar. No necesita preocuparse de que la posición de las piezas sea legal o ilegal, solo la cantidad de piezas.35
es solo una forma inusual de describir 8 cuadrados vacíos.Respuestas:
Retina , 105 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Expande los dígitos a cuadrados vacíos, que denotamos usando
1
s.Elimine la entrada si no coincide con 8 conjuntos de 8 cuadrados válidos unidos con
/
s. (Se agrega un/
prefijo adicional para simplificar la verificación).Elimine la entrada si no tiene un rey blanco o negro, o si tiene dos de cualquiera.
Elimina las piezas iniciales de las blancas, si todavía están allí.
Degradar las piezas blancas restantes a los peones.
Eliminar los peones blancos válidos.
Elimine la entrada si queda algún peón blanco.
Verifique nuevamente pero con las piezas negras.
Salida de un valor verdadero a menos que se elimine la línea.
fuente
JavaScript (ES6),
168174... 155Esta respuesta ha sido editada una cantidad embarazosa de veces. Con suerte, la versión actual es confiable y de golf decente.
Devuelve un booleano.
Formateado y comentado
Casos de prueba
Mostrar fragmento de código
fuente
Python 3,
284 259 236 225 247234 bytesPruébalo en línea!
¡Pruébelo en línea con todos los casos de prueba!
-11 bytes gracias al Sr. Xcoder
-13 bytes gracias a Jonathan Allen
+22 Olvidé que los reyes existían.
Semi-no golfista con alguna explicación:
fuente
,p,P=9,9
con;P=p=9
.for-loop
: /p>0<P
lugar dep>0and P>0
guardar 5 bytes. Alternativamente, podría haber usadop and P
(para -3 bytes), no necesita el>0
, porque los valores distintos de cero son verdaderos en Pythono=0
antes del ciclo e incrementando cono+=o<2
al final del cuerpo del ciclo.PHP , 269 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
181172174 bytesSin golf:
Mostrar fragmento de código
fuente
Python 3 , 263 bytes
Pruébalo en línea!
No es la presentación más pequeña de Python, pero creo que todavía tiene alguna promesa.
fuente