Given the position of two queens on a chess board, indicate whether or not they are positioned so that they can attack each other.
In the game of chess, a queen can attack pieces which are on the same row, column, or diagonal.
A chessboard can be represented by an 8 by 8 array.
So if you are told the white queen is at c5
(zero-indexed at column 2, row 3) and the black queen at f2
(zero-indexed at column 5, row 6), then you know that the set-up is like so:
You are also able to answer whether the queens can attack each other. In this case, that answer would be yes, they can, because both pieces share a diagonal.
The chessboard image was made by habere-et-dispertire using LaTeX and the chessboard package by Ulrike Fischer.
In Chess, rows are called "ranks", and columns are called "files". Ranks range from 1 to 8, while files range from A to H.
In this exercise, Square
is an opaque type which represents a square on a
chessboard. It uses 0-indexed row
& column
fields internally, and it
guarantees that they are always valid (i.e., from 0 to 7).
The create
function takes a Str
as input, representing a valid square on
the chessboard using the official notation, such as "C5"
. The create
function must parse this Str
, verify that it represents a valid square, and if
so it must return a Square
value containing the appropriate row
and column
fields. Rank 1 corresponds to row 0, and rank 8 corresponds to row 7. For
example, create "C5"
must return @Square { row : 2, column : 3 }
.
The QueenAttack
module also exposes handy rank
& file
functions. In the
example above, rank
must return the integer 5
, and file
must return the
character 'C'
.
Lastly, the queenCanAttack
function takes two different Square
values and
checks whether or not queens placed on these squares can attack each other.
Take-away: opaque types such as Square
are great when you want to offer some
guarantees, such as the fact that row
and column
are always between 0 and 7.
Opaque types also hide implementation details from the users, which makes the
API cleaner.
Sign up to Exercism to learn and master Roc with 105 exercises, and real human mentoring, all for free.