В мире шахмат было проделано много работы. Например, существует стандартизированный формат файла .pgn
, который описывает игру в шахматы, включая список ходов. Кроме того, есть другой формат файла .fen
, который описывает положение платы. Задача сегодня состоит в том, чтобы преобразовать список шахматных ходов ( в алгебраической записи ) в позицию на доске.
Определения
- Позиция
[a-h][1-8]
: определяется добавлением строки (файла) и столбца (ранг). Определяет одну из 64 возможных позиций на доске. - Часть
[KQRBNP]?
: Представляет K ING, Q ueen, R ООК, Б ishop, К Н РАВО, Р AWN. В алгебраической нотацииP
не используется. При использовании на доске буквы заглавные, если они белые, в противном случае строчные. - Перемещение
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
: фигура, за которой следует позиция, в которую она движется.- Если кусок неоднозначен, то указывается строка или столбец, или оба.
- Если кусок захватывает кусок, то
x
он помещается между куском и позицией. - Если ход является рокировкой, то в
O-O
противном случае он предоставляется стороне короляO-O-O
. - Если пешка продвигается, к ходу добавляется
=
фрагмент, за которым она продвигается. - Если ход ставит короля под контроль, к нему добавляется символ
+
. - Если ход ставит короля в мат, к нему добавляется
#
. - Цвет фигуры определяется номером хода (чередуются белые и черные ходы, начиная с черного).
- Доска
(([1-8]|[KQRBNPkqrbnp])*\/){8}
: Ряды даны путем перечисления частей в порядке строк. Если есть пустые квадраты, каждый цикл пустого квадрата дается с использованием длины цикла. Ряды разделены с помощью/
Начальная позиция доски - rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
это:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
Вам нужно взять список ходов и вернуть доску. Вы можете предположить, что ваши данные верны.
Примеры
-> 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
Это код-гольф , поэтому делайте ваши ответы как можно короче!
e.p.
.Ответы:
Javascript (ES6),
1024995 байтЭто ранняя и все еще громоздкая попытка. Я просто перестал оптимизировать его, когда был достигнут предел в 1К.
Это, вероятно, не пуленепробиваемый и рассматривает только акции для королевы. Но он выдерживает испытание.
Изменить: 995 байт - несколько очевидных оптимизаций
Источник
Полный исполняемый фрагмент
источник