Булеві значення (англ. Boolean) у Clojure позначаються true або false.
Функції-предикати (функції, які повертають булеве значення) зазвичай закінчуються знаком питання (?), але це лише домовленість.
Основна бібліотека містить функції для логічних операторів, як-от not, and й or.
У цій вправі ми реалізуємо логіку квестів для нової рольової гри, яку розробляє наш друг. Головну героїню гри звати Анналін, це смілива дівчина, у якої є відданий і хоробрий пес. На жаль, трапляється біда: її друга викрали, коли він шукав у лісі ягоди. Анналін спробує знайти й урятувати друга, можливо, взявши із собою в цю подорож свого пса.
Провівши деякий час за слідом, Анналін знаходить табір, де тримають її друга. Виявляється, викрадачів двоє: могутній лицар і хитрий лучник.
Знайшовши викрадачів, Анналін обмірковує, які з перелічених нижче дій вона може виконати:
На нас чекають чотири завдання: реалізувати логіку, яка визначає, чи доступні ці дії, залежно від стану трьох персонажів у лісі і від того, чи є поруч пес Анналін.
Реалізуйте функцію can-fast-attack?, яка приймає булеве значення (англ. Boolean), що вказує, чи лицар не спить. Функція повертає 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 вправ та справжнє наставництво від людей, і все це безкоштовно.