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.
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.
A tua tarefa é resolver o Enigma da Zebra para descobrires as respostas a estas duas perguntas:
As 15 afirmações seguintes são todas verdadeiras:
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.
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.
Define uma única função, SolvePuzzle, que devolve uma solução com duas strings, cujos valores são as respostas às perguntas do enigma da zebra: «Quem bebe água?» e «Quem é o dono da zebra?». Cada resposta será uma das nacionalidades dos moradores: Englishman, Spaniard, Ukrainian, Norwegian ou Japanese.
Obviamente, podias escrever uma função de uma só linha se espreitasses o programa de testes para ver a solução esperada. Mas o objetivo é desenvolveres um algoritmo que use os factos e as restrições fornecidos pelo enigma e determine as duas respostas corretas.
Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos165 exercícios, e mentoria humana real, tudo grátis.
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!