O Zebra Puzzle é um famoso quebra-cabeça de lógica com cinco casas, cada uma pintada de uma cor diferente. As casas têm moradores diferentes, que têm nacionalidades diferentes, criam animais de estimação diferentes, bebem bebidas diferentes e têm hobbies diferentes.
Para ajudar você a resolver o quebra-cabeça, são dadas 15 afirmações que descrevem a solução. No entanto, só combinando as informações de todas as afirmações você vai conseguir encontrar a solução do quebra-cabeça.
O Zebra Puzzle é um problema de satisfação de restrições (CSP). Em um problema assim, você tem um conjunto de valores possíveis e um conjunto de restrições que limitam quais valores são válidos. Outro CSP bem conhecido é o Sudoku.
Sua tarefa é resolver o Enigma da Zebra para encontrar a resposta a estas duas perguntas:
As 15 afirmações a seguir são todas verdadeiras:
Além disso, cada uma das cinco casas é pintada de uma cor diferente, e seus moradores têm nacionalidades diferentes, têm animais de estimação diferentes, bebem bebidas diferentes e praticam hobbies diferentes.
Existem 24 bilhões (5!⁵ = 24.883.200.000) de soluções possíveis, então tente descartar o maior número possível de soluções.
Implemente os métodos waterDrinker e zebraOwner da classe ZebraPuzzle.
Cada um deles deve retornar uma string, cujo valor é a resposta para as perguntas do quebra-cabeça da zebra "Quem bebe água?" e "Quem tem a Zebra?".
Cada resposta será uma das nacionalidades dos moradores: Englishman, Spaniard, Ukrainian, Norwegian ou Japanese.
Obviamente, você poderia simplesmente escrever duas funções de uma única instrução se espiar o programa de testes para ver a solução esperada. Mas o objetivo é desenvolver um algoritmo que use os fatos e as restrições dados do quebra-cabeça e determine as duas respostas corretas.
Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.
Explore 8 maneiras diferentes de encontrar a solução do Zebra Puzzle entre 24 bilhões de soluções possíveis, incluindo ignorar permutações inválidas o quanto antes, o algoritmo AC-3, uma solução baseada em lógica bem sucinta e até um algoritmo genético!