Das Zebra-Rätsel ist ein berühmtes Logikrätsel mit fünf Häusern, von denen jedes in einer anderen Farbe gestrichen ist. Die Häuser haben verschiedene Bewohner, die unterschiedliche Nationalitäten haben, unterschiedliche Haustiere besitzen, unterschiedliche Getränke trinken und unterschiedlichen Hobbys nachgehen.
Um das Rätsel zu lösen, bekommst du 15 Aussagen, die die Lösung beschreiben. Nur wenn du die Informationen aus allen Aussagen kombinierst, kannst du die Lösung des Rätsels finden.
Das Zebra-Rätsel ist ein Constraint-Satisfaction-Problem (CSP). Bei einem solchen Problem hast du eine Menge möglicher Werte und eine Menge von Einschränkungen, die festlegen, welche Werte gültig sind. Ein weiteres bekanntes CSP ist Sudoku.
Deine Aufgabe ist es, das Zebrarätsel zu lösen und so die Antworten auf diese beiden Fragen zu finden:
Die folgenden 15 Aussagen gelten alle als wahr:
Außerdem ist jedes der fünf Häuser in einer anderen Farbe gestrichen, und ihre Bewohner haben unterschiedliche Nationalitäten, halten unterschiedliche Haustiere, trinken unterschiedliche Getränke und gehen unterschiedlichen Hobbys nach.
Es gibt 24 Milliarden (5!⁵ = 24,883,200,000) mögliche Lösungen, also versuche, so viele Lösungen wie möglich auszuschließen.
Implementiere die Methoden waterDrinker und zebraOwner der Klasse ZebraPuzzle.
Jede von ihnen muss einen String zurückgeben, dessen Wert die Antwort auf die Fragen des Zebra-Puzzles ist: „Wer trinkt Wasser?“ und „Wem gehört das Zebra?“.
Jede Antwort ist eine der Nationalitäten der Bewohner: Englishman, Spaniard, Ukrainian, Norwegian oder Japanese.
Natürlich könntest du einfach zwei Funktionen mit einer einzigen Anweisung schreiben, wenn du einen Blick in das Testprogramm wirfst, um die erwartete Lösung zu sehen. Das Ziel ist aber, einen Algorithmus zu entwickeln, der die gegebenen Fakten und Randbedingungen des Puzzles nutzt und die beiden richtigen Antworten ermittelt.
Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.
Entdecke 8 verschiedene Wege, die Lösung des Zebra-Rätsels aus 24 Milliarden möglichen Lösungen zu finden, darunter das möglichst frühe Verwerfen ungültiger Permutationen, der AC-3-Algorithmus, eine sehr kompakte logikbasierte Lösung und sogar ein genetischer Algorithmus!