Se ha hecho mucho trabajo en el mundo del ajedrez. Por ejemplo, hay un formato de archivo estandarizado .pgn
que describe un juego de ajedrez, incluida la lista de movimientos. Además, hay otro formato de archivo .fen
que describe la posición del tablero. El desafío hoy es convertir una lista de movimientos de ajedrez ( en notación algebraica ) en una posición de tablero.
Definiciones
- Posición
[a-h][1-8]
: dada agregando la fila (archivo) y la columna (rango). Define una de las 64 posibles posiciones en el tablero. - Pieza
[KQRBNP]?
: Representa la K ing, Q ueen, R ook, B ishop, K N ight, P AWN. En notación algebraica,P
no se utiliza. Cuando se usa en un tablero, las letras son mayúsculas si son blancas, de lo contrario minúsculas. - Mover
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
: una pieza seguida de la posición a la que se mueve.- Si la pieza es ambigua, entonces se dan la fila o la columna, o ambas.
- Si la pieza captura una pieza,
x
se coloca entre la pieza y la posición. - Si el movimiento es un enroque, entonces
O-O
se da para el lado del rey, de lo contrarioO-O-O
. - Si se está promoviendo un peón, el movimiento se agrega
=
seguido de la pieza a la que se está promoviendo. - Si un movimiento pone al rey bajo control, se agrega con a
+
. - Si un movimiento pone al rey en jaque mate, se agrega con
#
. - El color de la pieza está determinado por el número de turno (turnos alternativos blancos y negros, comenzando por el negro).
- Tablero
(([1-8]|[KQRBNPkqrbnp])*\/){8}
: las filas se dan enumerando las piezas en orden de fila. Si hay cuadrados vacíos, cada corrida del cuadrado vacío se da usando la longitud de la corrida. Las filas se separan usando/
La posición inicial de un tablero es rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, que representa:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
Debe tomar una lista de Movimientos y devolver un Tablero. Puede suponer que su entrada es válida.
Ejemplos
-> rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
e4 -> rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR
e4,c5 -> rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5 -> rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5,dxe6 -> rnbqkbnr/ppp2ppp/4P3/8/8/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4 -> r1bqk2r/ppp2pp1/4Pn2/2P4p/6nP/8/PPP2PPN/RNBQKB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4 -> r1bqk2r/ppp2pp1/4P3/2P4p/3Q2nP/6P1/PPP2n1N/RNB1KB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O -> r1bq1rk1/ppp2pp1/4P3/2P4p/3Q1BnP/6P1/PPP2n1N/RN2KB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+ -> r1b2rk1/ppp2Pp1/8/2P3qp/3Q1BnP/N5P1/PPP4N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q -> r1br1Q2/ppp3pk/8/2P3Bp/3Q2nP/N5P1/PPP4N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q,Ngf2,c6,Rd7,cxd7,b6,d8=Q,c6,Q4d6,Ba6,Qd8f6 -> r4Q2/p5pk/bppQ1Q2/6Bp/7P/N5P1/PPP2n1N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q,Ngf2,c6,Rd7,cxd7,b6,d8=Q,c6,Q4d6,Ba6,Qd8f6,Rb8,Qdd8,b5,Qc5,b4,Qxb8,bxa3,Rd3,Nxd3+,Kd1,axb2,Bh3,b1=Q+,Kd2,Qxa2,Qh6+,gxh6,Qcd6,Qa1,Qbc7+,Kh8,Qdd8# -> 3Q3k/p1Q5/b1p4p/6Bp/7P/3n2PB/2PK3N/q6n
Este es un código de golf , ¡así que haga sus respuestas lo más breve posible!
e.p.
.Respuestas:
Javascript (ES6),
1024995 bytesEste es un intento temprano y todavía voluminoso. Simplemente dejé de optimizarlo cuando se alcanzó el límite de 1K.
Probablemente no sea a prueba de balas y solo considere promociones para una Reina. Pero sí pasa el caso de prueba.
Edición: 995 bytes: algunas optimizaciones obvias
Fuente
Fragmento ejecutable completo
fuente