Il y a beaucoup de travail qui a été fait dans le monde des échecs. Par exemple, il existe un format de fichier normalisé,, .pgn
qui décrit une partie d'échecs, y compris la liste des coups. De plus, il existe un autre format de fichier .fen
, qui décrit la position d'une carte. Le défi aujourd'hui est de convertir une liste de mouvements d'échecs ( en notation algébrique ) en position de plateau.
Définitions
- Position
[a-h][1-8]
: donnée en ajoutant la ligne (fichier) et la colonne (rang). Définit l'une des 64 positions possibles sur le tableau. - Pièce
[KQRBNP]?
: Représente le K ing, Q ueen, R ook, B ishop, K N ight, P awn. En notation algébrique,P
n'est pas utilisé. Lorsqu'elles sont utilisées sur un tableau, les lettres sont en majuscules si elles sont blanches, sinon en minuscules. - Déplacer
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
: un morceau suivi de la position vers laquelle il se déplace.- Si la pièce est ambiguë, la ligne, la colonne ou les deux sont données.
- Si la pièce capture une pièce, elle
x
est alors placée entre la pièce et la position. - Si le coup est un roque, alors
O-O
est donné pour le côté roi, sinonO-O-O
. - Si un pion est promu, le coup est ajouté avec
=
suivi de la pièce vers laquelle il est promu. - Si un coup met le roi en échec, il est accompagné d'un
+
. - Si un mouvement met le roi en échec et mat, il est ajouté
#
. - La couleur de la pièce est déterminée par le numéro de tour (tours alternés blanc et noir, en commençant par le noir.)
- Tableau
(([1-8]|[KQRBNPkqrbnp])*\/){8}
: Les lignes sont données en listant les pièces dans l'ordre des lignes. S'il y a des cases vides, chaque série de cases vides est donnée en utilisant la longueur de la série. Les lignes sont séparées en utilisant/
La position initiale d'un conseil est rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, ce qui représente:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
Vous devez prendre une liste de mouvements et retourner un plateau. Vous pouvez supposer que votre entrée est valide.
Exemples
-> 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
Ceci est un code-golf , alors faites vos réponses aussi courtes que possible!
e.p.
.Réponses:
Javascript (ES6),
1024995 octetsIl s'agit d'une tentative précoce et encore volumineuse. Je viens de cesser de l'optimiser lorsque la limite de 1K a été atteinte.
Ce n'est probablement pas à l'épreuve des balles et ne considère que les promotions à une reine. Mais il passe le test.
Edit: 995 octets - quelques optimisations évidentes
La source
Extrait exécutable complet
la source