Clojure에서 불리언은 true 또는 false로 표현해요.
프레디킷 함수(불리언을 반환하는 함수)는 보통 물음표(?)로 끝나지만, 이건 관례일 뿐이에요.
코어 라이브러리에는 not, and, or 같은 논리 연산자를 위한 함수가 들어 있어요.
이 연습 문제에서는 친구가 개발 중인 새로운 RPG 게임의 퀘스트 로직을 구현해요. 게임의 주인공은 용감한 소녀 애널린과 사납고 충직한 반려견이에요. 그런데 안타깝게도 불행이 닥쳐요. 친구가 숲에서 열매를 찾던 중 납치된 거예요. 애널린은 친구를 찾아 구출하려고 해요. 이 퀘스트에 반려견을 데리고 갈 수도 있어요.
한동안 흔적을 따라간 끝에, 애널린은 친구가 갇혀 있는 야영지를 발견해요. 알고 보니 납치범은 둘이었어요. 힘센 기사와 교활한 궁수예요.
납치범들을 찾은 애널린은 다음 행동 중 어떤 것을 할 수 있을지 고민해요:
네 가지 작업이 있어요. 숲에 있는 세 인물의 상태와 애널린의 반려견이 함께 있는지 여부에 따라 위 행동들이 가능한지 판단하는 로직을 구현하는 거예요.
기사가 깨어 있는지를 나타내는 불리언 값을 받는 can-fast-attack? 함수를 구현해요. 이 함수는 기사의 상태에 따라 빠른 공격이 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요:
(def knight-awake? true)
(can-fast-attack? knight-awake?)
;;=> false
기사, 궁수, 포로가 각각 깨어 있는지를 나타내는 세 개의 불리언 값을 받는 can-spy? 함수를 구현해요. 이 함수는 세 인물의 상태에 따라 첩보가 가능하면 true를 반환해요. 그렇지 않으면 false를 반환해요:
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true
궁수와 포로가 각각 깨어 있는지를 나타내는 두 개의 불리언 값을 받는 can-signal-prisoner? 함수를 구현해요. 이 함수는 두 인물의 상태에 따라 포로에게 신호를 보낼 수 있으면 true를 반환해요. 그렇지 않으면 false를 반환해요:
(def archer-awake? false)
(def prisoner-awake? true)
(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true
네 개의 불리언 값을 받는 can-free-prisoner? 함수를 구현해요. 처음 세 매개변수는 기사, 궁수, 포로가 각각 깨어 있는지를 나타내요. 마지막 매개변수는 애널린의 반려견이 함께 있는지를 나타내요. 이 함수는 세 인물의 상태와 애널린의 반려견의 동반 여부에 따라 포로를 구출할 수 있으면 true를 반환해요. 그렇지 않으면 false를 반환해요:
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)
(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false
Exercism에 가입하고 Clojure 트랙을 개념 12개연습 문제 105개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.