挑战
编写一个程序或函数,该程序或函数将字符串输入作为函数参数或从stdin输入并确定它是否为有效的FEN字符串。
输入值
您可以假定输入将仅包含以下字符(区分大小写)
pkqrbnPKQRBN12345678/
输入的长度将始终为最小1个字符和最大100个字符
输出量
输出应为真/假值。这些值可以是您希望的任何值,只要它们是一致的即可(所有真实结果具有相同的输出,所有虚假结果具有相同的输出)。您应该有两个截然不同的可能输出。
什么才算有效
小写字母代表黑色,大写字母代表白色。
您应该确保在象棋游戏中可能存在处于当前位置的棋子。
每个玩家将始终只有一个国王(k / K)
每个玩家最多只能有8个棋子(p / P)
每个玩家通常不会超过1 *王后(q / Q)
每个玩家通常都不会有更多少于2 *名新手(r / R)
每位球员通常不超过2 *名骑士(n / N)
每名球员通常不超过2 *名主教(b / B)
*合法的“将“兵”提升为这四个部分中的任何一个。
每位玩家的棋子,皇后,新手,骑士和主教的总数永远不会超过15
每个等级的总件数加上空方(以数字表示)应始终正好等于8。并且应该始终有8个等级,中间用正斜杠分隔。
您可以忽略的事情
您不必担心自己是否有可能发挥指定的位置,或者如果该位置是合法的,仅需保证所给定的数量即可存在。
您可以忽略FEN琴弦的进一步复杂性,例如演奏者回合,铸造权和传球权。
这是代码高尔夫。以字节为单位的最短程序获胜。通常存在漏洞和规则。
测试用例
输入 rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR
输出 True
输入 2br2k1 / 1p2n1q1 / p2p2p1 / P1bP1pNp / 1BP2PnP / 1Q1B2P1 / 8 / 3NR2K
输出 True
输入 r2r2k1 / p3q2p / ppR3pr / rP4bp / 3p4 / 5B1P / P4PP1 / 3Q1RK1
输出 False
(黑色有7个棋子和4个白钩-不可能)
输入 6k1 / pp3ppp / 4p3 / 2P3b1 / bPP3P1 / 3K4 / P3Q1q1
输出 False(仅7级)
输入 3r1rk1 / 1pp1bpp1 / 6p1 / pP1npqPn / 8 / 4N2P / P2PP3 / 1B2BP2 / R2QK2R
输出 False(9级)
输入 5n1k / 1p3r1qp / p3p3 / 2p1N2Q / 2P1R3 / 2P5 / P2r1PP1 / 4R1K1
输出 False(第二等级有9个正方形/个)
输入 rnbqkbnr / pppppppp / 8/35/8/8 / PPPPPPPP / RNBQKBNR
输出 True
感谢Feersum和Arnauld澄清了这种情况(3 + 5 = 8)
什么是芬?
FEN是用于在棋盘上记录棋子位置的标准符号。
图片来源http://www.chessgames.com
* It is legal for a player to 'promote' a pawn to any of these four pieces.
玩家可以减少9个皇后,只要减少棋子的数量即可。您无需担心棋子的合法或非法位置,而只需担心棋子的数量。
35
只是描述8个空方块的一种不寻常的方式。