Einstein schrieb ein Rätsel. Er sagte, dass 98% der Welt es nicht lösen könnten.
Ich habe dieses Rätsel in ungefähr 25 Minuten gelöst, als ich mit dem Zug zur Arbeit fuhr. Es ist im Grunde nur Abzug.
Das Rätsel
Es gibt 5 Häuser in 5 verschiedenen Farben hintereinander.
In jedem Haus wohnt eine Person mit einer anderen Nationalität.
Die 5 Besitzer trinken eine bestimmte Art von Getränk, rauchen eine bestimmte Zigarre und halten ein bestimmtes Haustier.
Kein Besitzer hat dasselbe Haustier, raucht dieselbe Zigarre oder trinkt dasselbe Getränk.
Frage: Wem gehört der Fisch?
Um dieses Rätsel zu lösen, gibt Einstein 15 Tipps:
- Der Brite wohnt im roten Haus.
- Der Schwede hält Hunde als Haustiere.
- Der Däne trinkt Tee.
- Das Gewächshaus befindet sich unmittelbar links vom Weißen Haus.
- Der Besitzer des Gewächshauses trinkt Kaffee.
- Der Besitzer, der Pall Mall raucht, züchtet Vögel.
- Der Besitzer des gelben Hauses raucht Dunhill.
- Der im Zentrum wohnende Besitzer trinkt Milch.
- Der Norweger wohnt im ersten Haus.
- Der Besitzer, der Blends raucht, wohnt neben dem, der Katzen hält.
- Der Besitzer, der das Pferd hält, wohnt neben dem, der Dunhill raucht.
- Der Besitzer, der Bluemasters raucht, trinkt Bier.
- Der Deutsche raucht Prince.
- Der Norweger wohnt neben dem blauen Haus.
- Der Besitzer, der Blends raucht, wohnt neben demjenigen, der Wasser trinkt.
Mit diesen Hinweisen können Sie zu einer Lösung kommen.
Ihre Aufgabe: Erstellen Sie ein Programm, das dieses Rätsel für Sie löst. Hardcodierung der Lösung ist nicht erlaubt (duh)
Es ist erlaubt, die Hinweise in jedem Format fest zu codieren.
Beispielformat:
//Hints in order
(Nationality:Brit)==(Color:Red)
(Nationality:Swede)==(Pet:Dogs)
(Nationality:Dane)==(Drink: Tea)
(Color:Green)/(Color:White)
(Color:Green)==(Drink:Coffee)
(Smoke:PallMall)==(Pet:Birds)
(Color:Yellow)==(Smoke:Dunhill)
(House:3)==(Drink:Milk)
(Nationality:Norwegian)==(House:1)
(Smoke:Blend)/\(Pet:Cats)
== bedeutet gleich
/ bedeutet links von
\ bedeutet rechts von
/ \ bedeutet links oder rechts von
Wie ich schon sagte, es ist entweder erlaubt, Hinweise fest zu codieren oder sie als Eingabe zu haben.
Ausgabe: Die Ausgabe sollte im folgenden Format erfolgen (mit den richtigen Werten, nur für die Trolle;))
_____________ _____________ _____________ _____________ _____________
| Number | | Number | | Number | | Number | | Number |
| Nationality | | Nationality | | Nationality | | Nationality | | Nationality |
| Color | | Color | | Color | | Color | | Color |
| Drink | | Drink | | Drink | | Drink | | Drink |
| Smoke | | Smoke | | Smoke | | Smoke | | Smoke |
| Pet | | Pet | | Pet | | Pet | | Pet |
--------------- --------------- --------------- --------------- ---------------
The <Nationality> in the <Color> house owns the fish!
Ascii Art-Boxen können von Ihnen geändert werden, solange es sich um Boxen handelt, unabhängig davon, welche Symbole Sie verwenden.
Jegliches Wissen über dieses Rätsel und diese Lösung kann nicht im Programm verwendet werden. Es sollte reine Logik und Ableitung verwenden, um das Rätsel zu lösen.
Markiert dies als Codegolf, könnte aber eine Code-Herausforderung sein, nicht sicher. Überlegungen zu den Gewinnkriterien für eine Code-Herausforderung können Sie gerne weitergeben :)
Derzeit ist dies Codegolf, sodass das Programm mit dem niedrigsten Bytecount gewinnt.
Viel Glück und viel Spaß beim Programmieren :)
Antworten:
Prolog - 954 Zeichen
Ausgabe
Schlüssel:
quelle
Ruby 322 + Eingabe 442
Brute-Force- Suche von fast 25 Milliarden möglichen Antworten.
Mein Computer würde ungefähr 75 Tage brauchen , um dieses Programm auszuführen.
Ich habe nie überprüft, ob dieses Programm die richtige Antwort ausgibt!
Rennen wie
ruby riddle.rb < riddle.in
riddle.rb (332 bytes)
riddle.in (442 bytes)
Die Eingabedatei muss 5 Zeilen mit Namen enthalten, gefolgt von Zeilen mit logischen Ausdrücken. Hausnummern sind 0 bis 4. Es muss ein
fish
.Das Programm ruft
Array#permutation
fünf Mal auf, um alle Arten der Bestellung von Nationalitäten, Farben, Getränken, Rauch und Haustieren zu finden. Die lange Schleife besteht darinc.product(*d){|a|...}
,Array#product
fast 25 Milliarden mögliche Antworten durchlaufen zu lassen. Der Schleifenkörper hat die Form(f=eval ...)&&(...)
. Dereval ...
Teil wertet die logischen Ausdrücke aus. Wenn alle zutreffen,f
ist die Hausnummer des Fisches und das&&(...)
Teil gibt die Antwort aus. Hausnummer 0 ist wahr in Ruby.Codegolf bedeutet, keinen Code für die Geschwindigkeit hinzuzufügen! Aber mir fehlen 75 Tage , um das Programm auszuführen!
quelle
Prolog, 653 Zeichen
quelle
Smalltalk 1332 Zeichen
Verwenden von einfachem Smalltalk:
Ausgabe:
Da die Golfversion kaum lesbar ist, finden Sie hier den Entwicklercode mit Eigennamen, Einrückungen und Leerzeichen zur besseren Lesbarkeit:
Verwenden einer Integritätsregelungsbibliothek:
Verwendung einer Constraint-Solver-Bibliothek, die der im OZ / Mozart-Handbuch beschriebenen sehr ähnlich ist. Ich gehe davon aus, dass Sie sich darüber beschweren werden, dass dies nicht für den Wettbewerb gilt ;-), es wird nur zu Ihrer Unterhaltung und Inspiration hinzugefügt (suchen Sie nach einem Contraint-Paket in Ihrer Sprache), ohne Golf und ohne Zeichen.
Beachten Sie den Operator "=:", der "Vereinigen mit" bedeutet. Der Löser verwendet einen Rückverfolgungsalgorithmus für die im Problemblock definierten Einschränkungen. Der verbleibende Code druckt die Lösung in Kästchen:
Ausgabe:
Edit: oops - Ich habe vergessen, die Zeile "Wem gehört der Fisch" in der einfachen Version zu drucken.
quelle
Ruby 1166 Zeichen
Bearbeiten: Aktualisiert für korrektes Ausgabeformat
Läuft auf einem MBP i5 konstant in weniger als 0,2 Sekunden.
Quelle: View On Github
Einzeiler:
Mit Zeilenumbrüchen aufgefüllt, um auf die Seite zu passen:
Ausgänge:
Ungolfed Code
Ausgänge:
Die Verwendung von
shuffle
bei der Ersteinrichtung stellt jedes Mal eindeutige Lösungspfade sicher. Sie können dies an der Anzahl der Versuche erkennen, die zwischen den Läufen geändert wurden. Dies verringert die Notwendigkeit, die Eingabe separat einzugeben, obwohl es trivial wäre, den Code zu ändern.quelle