Programming Geek
Rated 4.1/5 based on 446 reviews

Rook Moves: TCS CodeVita 2016 Round1 Question

Problem : Rook Moves


A Chess board position is accurately captured by Forsyth-Edwards notation and is abbreviated as FEN. A FEN "record" defines a particular game position, all in one text line and using only the ASCII character set. A FEN record contains six fields. A complete description of the FEN format to represent Chess positions can be found at here

For the purpose of this problem only consider first of the six fields of FEN. Before we describe the problem, let us look at how FEN maps to a board position. The following 5 images show board positions and its corresponding FEN representation.

                    Figure 1.

This board position depicts initial position before any side has made a move. In FEN format this board position is represented as

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w

Let's say, White plays e4. Then the board position looks like shown below

                    Figure 2.

This board position depicts the Chess board after White has played e4. In FEN format this board position is represented as

rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b

Similarly, 3 more half-moves are depicted in following diagrams

Figure 3.

Figure 4.

Figure 5.

The FENs corresponding to Figure 3, 4 and 5 are represented as

           3. rnbqkbnr/pppp1ppp/8/4P3/4P3/8/PPPP1PPP/RNBQKBNR w
           4. rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b
           5. rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w

Wikipedia describes first field of FEN format as follows

Each rank is described, starting with rank 8 and ending with rank 1; within each rank, the contents of each square are described from file "a" through file "h". Following the Standard Algebraic Notation (SAN), each piece is identified by a single letter taken from the standard English names (pawn = "P", knight = "N", bishop = "B", rook = "R", queen = "Q" and king = "K").[1] White pieces are designated using upper-case letters ("PNBRQK") while black pieces use lowercase ("pnbrqk"). Empty squares are noted using digits 1 through 8 (the number of empty squares), and "/" separates ranks.

The second field denotes whose move it is now. "w" depicts that it is White's turn to play and "b" indicates that it is Black's turn to play

CodeVita Problem Statement

Given a board position in FEN format, your task is to find out all the move(s) that Rook(s) of the playing side can make.

Input Format:
  1. First line contains single FEN record, which corresponds to a particular board position and also indicates whose turn it is.

Output Format:
  1. The output must be printed as follows
    1. All legal moves that Rook(s) can make must be in the format "[]"
    2. Where is move represented in format "[fromSquare][toSquare]"
  2. See Example section for better understanding of output format
  3. Follow Output printing specification to print the output in required format

  1. Since we focus on only first two parts of the FEN, we are essentially ignoring possibility of Castling. Hence our test cases don't contain FENs which give rise to such positions.

Sample Input and Output

SNo.InputBoard DepictionOutput
2k5/8/8/3B4/2PRN3/3B4/8/4K3 w

2k5/2p5/8/8/2PRN3/8/8/2K5 w

[d4d8, d4d7, d4d6, d4d5, d4d3, d4d2, d4d1]
3k4/2pp4/8/8/RR6/8/8/1K6 b

[a4a8, a4a7, a4a6, a4a5, a4a3, a4a2, a4a1, b4b8, b4b7, b4b6, b4b5, b4c4, b4d4, b4e4, b4f4, b4g4, b4h4, b4b3, b4b2]

Print Specification:
  1. Should start with "[" and end with "]"
  2. If more than one move is possible, moves should be separated by a comma followed by whitespace
  3. Moves of a single bishop should be printed in Move Format. Scan the board from 8th rank to 1st rank from a-file to h-file. Whichever square gets hit first, that move should be printed first.
  4. If more than one bishop exists for side to move, then start scanning for bishop from 8th rank to 1st rank, left to right i.e. from a-file to h-file. Whichever bishop appears first, print all moves for that bishop first.
  5. Verify your understanding of how printing should happen against examples shown above