Há muito trabalho feito no mundo do xadrez. Por exemplo, existe um formato de arquivo padronizado .pgn
, que descreve um jogo de xadrez, incluindo a lista de jogadas. Além disso, há outro formato de arquivo .fen
que descreve uma posição no quadro. O desafio hoje é converter uma lista de jogadas de xadrez ( em notação algébrica ) em uma posição no tabuleiro.
Definições
- Posição
[a-h][1-8]
: fornecida anexando a linha (arquivo) e a coluna (classificação). Define uma das 64 posições possíveis no quadro. - Parte
[KQRBNP]?
: Representa o K ing, Q ueen, R OOK, B ishop, K N ight, P aresta. Na notação algébrica,P
não é usado. Quando usadas em um quadro, as letras são maiúsculas, se forem brancas, caso contrário, minúsculas. - Mover
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
: Uma peça seguida pela posição para a qual está se movendo.- Se a peça for ambígua, a linha, a coluna ou ambas são fornecidas.
- Se a peça estiver capturando uma peça, ela
x
será colocada entre a peça e a posição. - Se o movimento for um roque, então
O-O
é dado para o rei, caso contrárioO-O-O
. - Se um peão estiver sendo promovido, a jogada será anexada
=
seguida pela peça para a qual está sendo promovido. - Se um lance colocar o rei em xeque, ele será anexado a
+
. - Se uma jogada colocar o rei em xeque-mate, ela será anexada
#
. - A cor da peça é determinada pelo número do turno (turnos alternados em branco e preto, começando com preto).
- Quadro
(([1-8]|[KQRBNPkqrbnp])*\/){8}
: As linhas são dadas listando as peças em ordem de linha. Se houver quadrados vazios, cada corrida do quadrado vazio é dada usando o comprimento da corrida. As linhas são separadas usando/
A posição inicial de uma diretoria é rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
Você precisa fazer uma lista de movimentos e devolver uma prancha. Você pode assumir que sua entrada é válida.
Exemplos
-> 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 é um código de golfe , portanto, faça suas respostas o mais curto possível!
e.p.
.Respostas:
Javascript (ES6),
1024995 bytesEsta é uma tentativa inicial e ainda volumosa. Eu apenas parei de otimizá-lo quando o limite de 1K foi atingido.
Provavelmente não é à prova de balas e considera apenas promoções para uma rainha. Mas passa no caso de teste.
Edit: 995 bytes - algumas otimizações óbvias
Fonte
Fragmento executável completo
fonte