在国际象棋世界中已经做了很多工作。例如,存在一种标准的文件格式,.pgn
该格式描述了一个国际象棋游戏,其中包括动作列表。此外,还有另一种文件格式.fen
,它描述了电路板的位置。 今天的挑战是将国际象棋移动(以代数符号表示)列表转换为棋盘位置。
定义
- 位置
[a-h][1-8]
:通过附加行(文件)和列(行)来给出。定义板上64个可能的位置之一。 - 片
[KQRBNP]?
:表示ķ ING,Q ueen,- [R OOK,乙 ishop,K Ñ飞行,P芒。用代数符号P
不使用。在板上使用时,如果字母为白色,则字母为大写,否则为小写。 - 移动
[KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O)
:一块,然后是它要移动的位置。- 如果片段不明确,则给出行或列,或同时给出两者。
- 如果工件正在捕获工件,则将
x
其放置在工件和位置之间。 - 如果此举是a脚的话,
O-O
则为国王一方,否则为O-O-O
。 - 如果要提升典当,则在移动
=
之后附加要提升的棋子。 - 如果此举使国王受阻,则会附加一个
+
。 - 如果此举使国王成为将军,则将其附加在
#
。 - 作品的颜色由匝数决定(白色和黑色交替匝数,从黑色开始)。
- 木板
(([1-8]|[KQRBNPkqrbnp])*\/){8}
:通过按行顺序列出碎片来指定行。如果有空方块,则使用游程的长度给出每个空方块的游程。行使用分隔/
董事会的初始职位为rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
,代表:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
您需要列出一个Move清单并返回一个Board。您可以假定您的输入有效。
例子
-> 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
这是一个代码问题,所以请使您的答案尽可能短!
所以没有恩人:p?
—
阿德南
@Adnan我相信我的测试用例包括一个伴随者。
—
内森·美林
哦,对不起,我没有看到。我总是习惯于用来表示被动移动
—
阿德南
e.p.
。
我们可以采取空格分隔的举动吗?
—
orlp
当然。任何列表格式都是可以接受的。
—
内森·美林