체스판 위에 있는 두 퀸의 위치가 주어졌을 때, 두 퀸이 서로를 공격할 수 있는 위치에 있는지 판별해요.
체스에서 퀸은 같은 행, 열, 대각선에 있는 기물을 공격할 수 있어요.
체스판은 8x8 배열로 나타낼 수 있어요.
따라서 흰 퀸이 c5(0부터 세면 열 2, 행 3)에 있고 검은 퀸이 f2(0부터 세면 열 5, 행 6)에 있다면, 배치는 다음과 같아요:
두 퀸이 서로를 공격할 수 있는지도 답할 수 있어요. 이 경우에도 두 퀸은 서로를 공격할 수 있다고 답할 수 있어요. 두 기물이 같은 대각선을 공유하기 때문이에요.
체스판 이미지는 habere-et-dispertire가 LaTeX와 Ulrike Fischer의 chessboard 패키지를 사용해 만들었어요.
체스에서는 가로줄을 "랭크", 세로줄을 "파일"이라고 해요. 랭크는 1부터 8까지이고, 파일은 A부터 H까지예요.
이 연습 문제에서 Square는 체스판의 칸을 나타내는 불투명 타입이에요.
내부적으로는 0부터 시작하는 row와 column 필드를 사용하고, 이 값들이 항상 유효하다는 것, 즉 0부터 7까지라는 것을 보장해요.
create 함수는 공식 표기법으로 체스판의 유효한 칸을 나타내는 Str을 입력으로 받아요. 예를 들어 "C5" 같은 형식이에요.
create 함수는 이 Str을 파싱해서 유효한 칸을 나타내는지 확인하고, 그렇다면 적절한 row와 column 필드를 담은 Square 값을 반환해야 해요.
랭크 1은 행 0에, 랭크 8은 행 7에 대응해요.
예를 들어 create("C5")는 행 4, 열 2인 칸을 반환해야 해요.
Square 타입은 편리한 rank와 file 메서드도 제공해요.
위 예시에서 rank는 정수 5를 반환해야 하고, file은 문자 'C'를 반환해야 해요.
마지막으로, queen_can_attack 함수는 서로 다른 Square 값 두 개를 받아서, 이 칸에 놓인 퀸들이 서로를 공격할 수 있는지 확인해요.
기억할 점: Square 같은 불투명 타입은 row와 column이 항상 0과 7 사이에 있다는 것처럼 몇 가지 보장을 제공하고 싶을 때 아주 유용해요.
불투명 타입은 사용자로부터 구현 세부 사항을 숨겨 주기 때문에 API가 더 깔끔해져요.