Dadas as posições de duas rainhas num tabuleiro de xadrez, indica se estão posicionadas de forma a poderem atacar-se uma à outra.
No jogo de xadrez, uma rainha pode atacar peças que estejam na mesma linha, coluna ou diagonal.
Um tabuleiro de xadrez pode ser representado por um array 8 por 8.
Assim, se te disserem que a rainha branca está em c5 (indexado a zero na coluna 2, linha 3) e a rainha preta em f2 (indexado a zero na coluna 5, linha 6), então sabes que a disposição é a seguinte:
Também consegues responder se as rainhas se podem atacar uma à outra. Neste caso, a resposta seria sim, podem, porque ambas as peças partilham uma diagonal.
A imagem do tabuleiro de xadrez foi feita por habere-et-dispertire com LaTeX e o pacote chessboard de Ulrike Fischer.
No xadrez, as linhas chamam-se "filas" e as colunas chamam-se "colunas". As filas vão de 1 a 8, enquanto as colunas vão de A a H.
Neste exercício, Square é um tipo opaco que representa uma casa de um tabuleiro de xadrez. Internamente, usa os campos row e column indexados a partir de 0 e garante que são sempre válidos (ou seja, de 0 a 7).
A função create recebe um Str como parâmetro de entrada, representando uma casa válida do tabuleiro através da notação oficial, como "C5". A função create tem de analisar esse Str, verificar que representa uma casa válida e, se for o caso, devolver um valor Square com os campos row e column adequados. A fila 1 corresponde à linha 0, e a fila 8 corresponde à linha 7. Por exemplo, create("C5") tem de devolver uma casa com linha 4 e coluna 2.
O tipo Square também expõe métodos práticos rank e file. No exemplo acima, rank tem de devolver o número inteiro 5 e file tem de devolver o caráter 'C'.
Por fim, a função queen_can_attack recebe dois valores Square diferentes e verifica se duas rainhas colocadas nessas casas se podem atacar uma à outra.
Conclusão: os tipos opacos, como Square, são ótimos quando queres oferecer algumas garantias, como o facto de row e column estarem sempre entre 0 e 7. Os tipos opacos também escondem detalhes de implementação dos utilizadores, o que torna a API mais limpa.
Inscreve-te no Exercism para aprenderes e dominares Roc com 120 exercícios, e mentoria humana real, tudo grátis.