12
0
The challenge
Write a program or function which takes a string input as a function parameter or from stdin and determines if it is a valid FEN string.
Input
You can assume the input will only ever include the following characters (case sensitive)
pkqrbnPKQRBN12345678/
The length of the input will always be a minimum of 1 character and a maximum of 100 characters
Output
Output should be a truthy/falsey value. These can be any values you wish as long as they are consistent (all truthy results have the same output, all falsey results have the same output). You should have exactly two distinct possible outputs.
What counts as valid
Lowercase letters represent black pieces, uppercase letters represent white pieces.
You should ensure it is possible in a game of chess for the pieces in the current position to exist.
Each player will always have exactly 1 king (k/K)
Each player may have no more than 8 pawns (p/P)
Each player will usually have no more than 1* queen (q/Q)
Each player will usually have no more than 2* rooks (r/R)
Each player will usually have no more than 2* knights (n/N)
Each player will usually have no more than 2* bishops (b/B)
* It is legal for a player to 'promote' a pawn to any of these four pieces.
The total of pawns, queens, rooks, knights and bishops for each player will never be more than 15
The total number of pieces plus empty squares (denoted by numbers) should always add up to exactly 8 for each rank. And there should always be exactly 8 ranks, separated by a forward slash.
Things you can ignore
You do not need to concern yourself with whether or not it is possible to play into the position denoted, or if the position is legal, only that the pieces can exist in the quantities given.
You can ignore further complexities of FEN strings such as player turn, castling rights and en passant.
This is code golf. Shortest program in bytes wins. Usual loopholes and rules apply.
Test Cases
Input rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
Output True
Input 2br2k1/1p2n1q1/p2p2p1/P1bP1pNp/1BP2PnP/1Q1B2P1/8/3NR2K
Output True
Input r2r2k1/p3q2p/ppR3pr/rP4bp/3p4/5B1P/P4PP1/3Q1RK1
Output False
(black has 7 pawns and 4 rooks - impossible)
Input 6k1/pp3ppp/4p3/2P3b1/bPP3P1/3K4/P3Q1q1
Output False
(only 7 ranks)
Input 3r1rk1/1pp1bpp1/6p1/pP1npqPn/8/4N2P/P2PP3/1B2BP2/R2QK2R
Output False
(9 ranks)
Input 5n1k/1p3r1qp/p3p3/2p1N2Q/2P1R3/2P5/P2r1PP1/4R1K1
Output False
(2nd rank has 9 squares/pieces)
Input rnbqkbnr/pppppppp/8/35/8/8/PPPPPPPP/RNBQKBNR
Output True
Thanks to Feersum and Arnauld for clarifying this case (3+5=8)
What is FEN?
FEN is a standard notation for recording the position of the pieces on a chess board.
Image credit http://www.chessgames.com
“Each player will usually have no more than 1* queen”—please clarify what counts as valid, since I assume it doesn’t matter what counts as “usual”. Is it valid for white to have nine queens? Ten queens? Eight pawns and two queens? Zero kings? An unpromoted pawn on the first or last rank? – Anders Kaseorg – 2017-07-01T02:06:13.760
@AndersKaseorg
* It is legal for a player to 'promote' a pawn to any of these four pieces.
The player may have up to 9 queens so long as the number of pawns is reduced to compensate. You do not need to worry about the position of the pieces being legal or illegal, only the number of pieces. – Darren H – 2017-07-01T02:08:28.777pkqrbnPKQRBN/
should bepkqrbnPKQRBN12345678/
, no? – Augmented Fourth – 2017-07-01T02:11:15.717@AugmentedFourth a valid point, I will edit that in – Darren H – 2017-07-01T02:11:41.873
What about zero kings (which cannot happen in any real game of chess)? Or a state in which a promotion has occurred without any captures on either side (also not possible in any real game)? There are probably some less obvious conditions imposed by real games, so if you don’t intend to make us figure all that out, we need an unambiguous explanation of what you consider valid. – Anders Kaseorg – 2017-07-01T02:13:39.563
My apologies if it was not clear. It is my intention that the focus be on the quantities rather than the position. I have stated that you do not need to worry about whether or not the position is legal or possible to reach in normal play. I will attempt to rewrite the validity section to reduce any ambiguity. – Darren H – 2017-07-01T02:17:38.263
1In your third test-case, black has 6 pawns, not 7, making it a 'True' (?) – pizzapants184 – 2017-07-01T05:10:40.143
A good false test case to add:
rnbqkbnr/pppppppp/8/35/8/8/PPPPPPPP/RNBQKBNR
– feersum – 2017-07-01T06:10:26.913@feersum This FEN is badly formed indeed but I don't think it's breaking any of the rules described in the challenge. (And many chess engines will probably accept it as input.) – Arnauld – 2017-07-01T10:45:25.837
@pizzapants184 I will recheck all my test cases – Darren H – 2017-07-01T10:52:30.210
@feersum that would be invalid due to
The total number of pieces plus empty squares (denoted by numbers) should always add up to exactly 8 for each rank.
– Darren H – 2017-07-01T10:53:23.3801@DarrenH The FEN position proposed by feersum is valid according to your current rules.
35
is just an unusual way to describe 8 empty squares. – Arnauld – 2017-07-01T10:57:19.293@Arnauld In that case I have misunderstood that aspect of FEN and consider myself corrected. I will include that as a positive test case – Darren H – 2017-07-01T11:00:06.460
I'm not saying that it's a valid FEN position. I'm just saying that it does not break any of the rules described in the challenge. – Arnauld – 2017-07-01T11:01:43.797
Let us continue this discussion in chat.
– Arnauld – 2017-07-01T11:03:23.880Can it be okay to take input through command line arguments? – Comrade SparklePony – 2017-07-01T11:52:24.057
@ComradeSparklePony Yes that's fine – Darren H – 2017-07-01T11:53:02.020
I'd say add a test case for invalid FEN due to black pawns on first rank or white pawns on last rank – Patrick Roberts – 2017-07-01T14:13:28.163
1@PatrickRoberts pawns on first or last rank are valid for the purpose of this challenge. You do not need to account for the legality of a position, only the quantity of pieces. Accounting for the legality of a position (such as both players being in check) adds a lot of complexity so I figured a blanket of 'position doesn't matter' is clearer than a debate on where to draw the line of what needs accounted for and what doesn't. – Darren H – 2017-07-01T14:18:10.133
I was suggesting that
35
is an invalid way to represent 8. The rules are not too specific on this point but don't suggest to me that it should be valid. – feersum – 2017-07-01T17:28:10.117