W świecie szachów wykonano sporo pracy. Na przykład istnieje znormalizowany format pliku .pgn
, który opisuje grę w szachy, w tym listę ruchów. Dodatkowo istnieje inny format pliku .fen
, który opisuje pozycję tablicy. Dzisiejsze wyzwanie polega na przekształceniu listy ruchów szachowych ( w zapisie algebraicznym ) na pozycję na planszy.
Definicje
- Pozycja
[a-h][1-8]
: dane przez dodanie wiersza (pliku) i kolumny (rangi). Definiuje jedną z 64 możliwych pozycji na planszy. - Piece
[KQRBNP]?
: Reprezentuje K ing, Q ueen, R ook, B ishop, K N ight, P awn. W notacji algebraicznejP
nie jest używany. Gdy są używane na planszy, litery są wielkie, jeśli są białe, w przeciwnym razie małe. - Ruch
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
: Kawałek, po którym następuje pozycja, do której się porusza.- Jeśli kawałek jest niejednoznaczny, wówczas podaje się rząd, kolumnę lub oba.
- Jeśli element chwyta element,
x
jest on umieszczany między elementem a pozycją. - Jeśli ruch jest roszadą, wówczas
O-O
podaje się go po stronie króla, w przeciwnym razieO-O-O
. - Jeśli pionek jest promowany, ruch jest dołączany, a
=
następnie pion, na który jest promowany. - Jeśli ruch stawia króla w ryzach, dodaje się do niego znak
+
. - Jeśli ruch stawia króla w szachach, dołącza się go
#
. - Kolor pionu zależy od numeru zwoju (naprzemiennie białe i czarne zwoje, zaczynając od czarnego).
- Plansza
(([1-8]|[KQRBNPkqrbnp])*\/){8}
: Rzędy podaje się, wymieniając elementy w kolejności rzędów. Jeśli są puste kwadraty, każdy ciąg pustego kwadratu jest podawany na podstawie długości przebiegu. Rzędy są rozdzielane za pomocą/
Początkowa pozycja planszy to rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
Musisz wziąć listę ruchów i zwrócić planszę. Możesz założyć, że twoje dane wejściowe są prawidłowe.
Przykłady
-> 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
To jest gra w golfa , więc udziel odpowiedzi tak krótko, jak to możliwe!
e.p.
.Odpowiedzi:
JavaScript (ES6),
1024995 bajtówTo wczesna i wciąż nieporęczna próba. Właśnie przestałem go optymalizować po osiągnięciu limitu 1K.
Prawdopodobnie nie jest kuloodporny i bierze pod uwagę tylko awanse do Królowej. Ale to zdaje test.
Edycja: 995 bajtów - kilka oczywistych optymalizacji
Źródło
Pełny plik wykonywalny
źródło