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 and 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 a square with row 4 and column 2.
The Square type also exposes handy rank and file methods.
In the example above, rank must return the integer 5, and file must return the character 'C'.
Lastly, the queen_can_attack 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 120 exercises, and real human mentoring, all for free.