Tracks
/
Roc
Roc
/
Exercises
/
Queen Attack
Queen Attack

Queen Attack

Easy

Instructions

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:

A chess board with two queens. Arrows emanating from the queen at c5 indicate possible directions of capture along file, rank and diagonal.

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.

Credit

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.

Edit via GitHub The link opens in a new window or tab
Roc Exercism

Ready to start Queen Attack?

Sign up to Exercism to learn and master Roc with 105 exercises, and real human mentoring, all for free.