Головоломка про зебру - це відома логічна головоломка, у якій є пʼять будинків, кожен пофарбований в інший колір. У будинках живуть різні мешканці: вони мають різні національності, тримають різних улюбленців, пʼють різні напої та мають різні захоплення.
Щоб допомогти розвʼязати головоломку, нам дають 15 тверджень, які описують розвʼязок. Однак лише поєднавши інформацію з усіх тверджень, ми зможемо знайти розвʼязок головоломки.
Головоломка про зебру належить до задач задоволення обмежень (CSP). У такій задачі ми маємо набір можливих значень і набір обмежень, які визначають, які з цих значень припустимі. Ще одна відома задача задоволення обмежень - судоку.
Розвʼяжіть задачу про зебру та знайдіть відповіді на ці два запитання:
Про всі наведені нижче 15 тверджень відомо, що вони правдиві:
Крім того, кожен із пʼяти будинків пофарбований в інший колір, а їхні мешканці різного національного походження, тримають різних тварин, пʼють різні напої та мають різні захоплення.
Існує 24 мільярди (5!⁵ = 24,883,200,000) можливих розвʼязків, тож спробуйте відкинути якомога більше з них.
Реалізуйте методи waterDrinker та zebraOwner класу ZebraPuzzle.
Кожен із них має повертати рядок тексту (англ. string), значенням якого буде відповідь на питання задачі про зебру: «Хто пʼє воду?» і «У кого зебра?».
Кожною відповіддю буде одна з національностей мешканця: Englishman, Spaniard, Ukrainian, Norwegian або Japanese.
Вочевидь, можна було б просто написати дві функції, кожна з яких складається з однієї інструкції, якщо зазирнути в тестову програму й побачити очікуване рішення. Але мета - розробити алгоритм, який використовує задані факти й обмеження задачі та визначає дві правильні відповіді.
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.
Розгляньмо 8 різних способів знайти розвʼязок Загадки про зебру серед 24 мільярдів можливих варіантів, зокрема ігнорування неправильних перестановок якомога раніше, алгоритм AC-3, дуже стислий розвʼязок на основі логіки і навіть генетичний алгоритм!