Enigma da Zebra

Enigma da Zebra

Médio

Introdução

O enigma da zebra é um famoso problema de lógica no qual existem cinco casas, cada uma pintada com uma cor diferente. As casas têm habitantes diferentes, que têm nacionalidades diferentes, têm animais de estimação diferentes, bebem bebidas diferentes e têm passatempos diferentes.

Para te ajudar a resolver o enigma, são-te apresentadas 15 afirmações que descrevem a solução. No entanto, só combinando a informação de todas as afirmações é que conseguirás encontrar a solução do enigma.

Note

O enigma da zebra é um problema de satisfação de restrições (CSP). Neste tipo de problema, tens um conjunto de valores possíveis e um conjunto de restrições que limitam quais desses valores são válidos. Outro CSP bem conhecido é o Sudoku.

Instruções

A tua tarefa é resolver o Enigma da Zebra para descobrires as respostas a estas duas perguntas:

  • Qual dos residentes bebe água?
  • Quem é dono da zebra?

Enigma

As 15 afirmações seguintes são todas verdadeiras:

  1. Há cinco casas.
  2. O inglês vive na casa vermelha.
  3. O espanhol é dono do cão.
  4. A pessoa que vive na casa verde bebe café.
  5. O ucraniano bebe chá.
  6. A casa verde fica imediatamente à direita da casa de marfim.
  7. O dono do caracol gosta de ir dançar.
  8. A pessoa que vive na casa amarela é pintor.
  9. A pessoa que vive na casa do meio bebe leite.
  10. O norueguês vive na primeira casa.
  11. Quem gosta de ler vive na casa ao lado da pessoa que tem a raposa.
  12. A casa do pintor fica ao lado da casa que tem o cavalo.
  13. Quem joga futebol bebe sumo de laranja.
  14. O japonês joga xadrez.
  15. O norueguês vive ao lado da casa azul.

Para além disso, cada uma das cinco casas está pintada de uma cor diferente, e os seus habitantes têm nacionalidades diferentes, têm animais de estimação diferentes, bebem bebidas diferentes e têm passatempos diferentes.

Note

Há 24 mil milhões (5!⁵ = 24 883 200 000) de soluções possíveis, por isso tenta eliminar o maior número possível de soluções.

Implementação

Implementa os métodos waterDrinker e zebraOwner da classe ZebraPuzzle. Cada um deve devolver uma string, cujo valor é a resposta às perguntas do quebra-cabeças da zebra: "Quem bebe água?" e "Quem tem a zebra?". Cada resposta será uma das nacionalidades dos residentes: Englishman, Spaniard, Ukrainian, Norwegian ou Japanese.

Obviamente, se espreitares o programa de testes para ver a solução esperada, podias simplesmente escrever duas funções com uma única instrução cada. Mas o objetivo é desenvolver um algoritmo que use os factos e as restrições do quebra-cabeças e determine as duas respostas corretas.


Fonte

WikipediaO link abre numa nova janela ou separador
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Enigma da Zebra?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Enigma da Zebra!

Explora 8 formas diferentes de encontrar a solução do Zebra Puzzle entre 24 mil milhões de soluções possíveis, incluindo ignorar permutações inválidas o mais cedo possível, o algoritmo AC-3, uma solução muito sucinta baseada em lógica e até um algoritmo genético!