PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer findet den Hasen?


HellHorse
2004-06-07, 21:08:18
Hi

Dieser Thread ist gedacht als Folgethread zu Wer findet den schnellsten Primzahlalgorithmus (http://www.forum-3dcenter.org/vbulletin/showthread.php?s=&threadid=95859)

Es hat irgendwie Spass gemacht, allerdings laufen all diese "Wer findet einen X-Algorithmus?" bloss darauf raus, einen bestimmten Algorithmus von jemand anderem zu implementieren und ein paar kleine tweaks zu machen.
Irgendwie fällt das Knobeln weg.

Also habe ich die Augen offen gehalten, nach einem Problem, das sich meiner Meinung nach besser eignen würde. Es sollte einfach zu beschrieben und verstehen sein, aber knifflig zu lösen.

Dabei stiess ich auf "Einsteins Rätsel"
Der Legende nach soll Einstein dies im 20. Jahrhundert verfasst haben und behauptete 98% der Weltbevölkerung seien nicht in der Lage es zu lösen.
Es kursieren diverse Varianten davon. Ich weiss leider nicht, welches die originale ist.

Folgende Situation:
Es gibt fünf Häuser, die in einer Reihe nebeneinader stehen.
Jedes Haus hat eine andere Farbe.
In jedem Haus wohnt eine Person einer anderen Nationalität.
Jeder Hausbewohner bevorzugt ein anderes Getränk.
Jeder Hausbewohner bevorzugt eine andere Zigarettenmarke.
Jeder Hausbewohner hält ein anderes Haustier.

Frage: Wer hält den Hasen als Haustier?
Es gibt folgende Hinweise:

Der Brite wohnt im roten Haus.
Der Schwede hält einen Hund als Haustier.
Der Däne trinkt gerne Tee.
Das grüne Haus steht links vom weissen Haus.
Der Besiter des grünen Hauses trinkt Kaffee.
Die Person, die Pall Mall raucht, hält einen Vogel als Haustier.
Der Mann, der im mittleren Haus wohnt, trinkt Milch.
Der Besitzer des gelben Hauses raucht Dunhill.
Der Norweger wohnt im ersten Haus.
Der Marlboro-Raucher wohnt neben dem, der eine Katze hält.
Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht.
Der Winnfield-Raucher trinkt gerne Bier.
Der Norweger wohnt neben dem blauen Haus.
Der Deutsche raucht gerne Rothmanns.
Der Marlboro-Raucher hat einen Nachbarn der Wasser trinkt.


Hier meine Lösung un PROLOG:

homes( [[_, _, _, _, _],
[_, _, _, _, _],
[_, _, _, _, _],
[_, _, _, _, _],
[_, _, _, _, _]]).

home(Index, Homes, Home) :-
nth1(Index, Homes, Home).

color(Index, Homes, Color) :-
nth1(Index, Homes, Current),
color(Current, Color).

color(Home, Color) :-
nth1(1, Home, Color).

nationality(Index, Homes, Nationality) :-
nth1(Index, Homes, Current),
nationality(Current, Nationality).

nationality(Home, Nationality) :-
nth1(2, Home, Nationality).

drink(Index, Homes, Drink) :-
nth1(Index, Homes, Current),
drink(Current, Drink).

drink(Home, Drink) :-
nth1(3, Home, Drink).

cigarette(Index, Homes, Cigarette) :-
nth1(Index, Homes, Current),
cigarette(Current, Cigarette).

cigarette(Home, Cigarette) :-
nth1(4, Home, Cigarette).

animal(Index, Homes, Animal) :-
nth1(Index, Homes, Current),
animal(Current, Animal).

animal(Home, Animal) :-
nth1(5, Home, Animal).

neighbor(Houses, Index, Neighbor) :-
X is Index + 1,
nth1(X, Houses, Neighbor).

neighbor(Houses, Index, Neighbor) :-
X is Index - 1,
nth1(X, Houses, Neighbor).

solve(X) :-
homes(H),

% hint 1
nationality(I1, H, 'british'),
color(I1, H, 'red'),

% hint 2
nationality(I2, H, 'swedish'),
animal(I2, H, 'dog'),

% hint 3
nationality(I3, H, 'danish'),
drink(I3, H, 'tea'),

% hint 4
color(I4, H, 'green'),
I41 is I4 + 1,
color(I41, H, 'white'),

% hint 5
color(I5, H, 'green'),
drink(I5, H, 'coffee'),

% hint 6
cigarette(I6, H, 'pall mall'),
animal(I6, H, 'brid'),

% hint 7
drink(3, H, 'milk'),

% hint 8
color(I8, H, 'yellow'),
cigarette(I8, H, 'dunhill'),

% hint 9
nationality(1, H, 'norway'),

% hint 10
cigarette(I10, H, 'marlboro'),
neighbor(H, I10, Marlboroneighbor1),
animal(Marlboroneighbor1, 'cat'),

% hint 11
animal(I11, H, 'horse'),
neighbor(H, I11, Horseneighbor),
cigarette(Horseneighbor, 'dunhill'),

% hint 12
cigarette(I12, H, 'winfield'),
drink(I12, H, 'beer'),

% hint 13
nationality(I13, H, 'norway'),
neighbor(H, I13, Norwayneighbor),
color(Norwayneighbor, 'blue'),

% hint 14
nationality(I14, H, 'german'),
cigarette(I14, H, 'rothmanns'),

% hint 15
neighbor(H, I10, Marlboroneighbor2),
drink(Marlboroneighbor2, 'water'),

% find the bunny
animal(IS, H, 'bunny'),
nationality(IS, H, X).

Kriterien:
Egal, Hauptsache es läuft :)

Gast
2004-06-07, 21:34:54
Logik.
Wenn der Brite im roten Haus wohnt, wohnen alle anderen nicht im roten Haus. Von irgendwoher erfährt man dann z.b: dass der der im roten Haus wohnt Wasser trinkt. Jetzt weiß man:
Der Brite trinkt Wasser.
Alle anderen trinken nicht Wasser.
Alle die nicht im roten Haus wohnen trinken nicht Wasser.

Das "von irgendwoher" sind am Anfang natürlich die Hinweise, später dann solche Schlussfolgerungen.

Gibts noch einen andere Lösungsmethode?

Gast
2004-06-07, 21:38:08
p.s:

Solche Rätsel gibts immer im P.M. - das einzig gute an der zeitschrift :D

HellHorse
2004-06-07, 22:36:09
Original geschrieben von Gast
Logik.
Sag bloss, und ich war verwundert, dass es in PROLOG einfach geht :stareup:
(Nicht böse gemeint)

Die Idee ist aber nicht, dass du es nicht "von Hand" löst, sondern implementierst.

Stone2001
2004-06-07, 22:45:01
Zitat eines gewissen Albert E. :

Nur etwa 2 % der Weltbevöklerung sind in der Lage diese Rätsel ohne Hilfsmittel zu lösen!

Das Rästel trägt deshalbs auch Albert's Namen.

BTW: Ich finde das Prolog-Programm cool! ;)

HellHorse
2004-06-07, 23:13:33
Was zählt der alles als Hilfsmittel?

Stone2001
2004-06-07, 23:36:20
Original geschrieben von HellHorse
Was zählt der alles als Hilfsmittel?
AFAIK alles was man anfassen kann. Das einzigste, was man hat sind die Regeln auf einem Blatt Papier!

HellHorse
2004-06-08, 08:20:44
Original geschrieben von Stone2001
AFAIK alles was man anfassen kann. Das einzigste, was man hat sind die Regeln auf einem Blatt Papier!
Also ganz im Kopf lösen?
Und dann auf 2% kommen?

DocEW
2004-06-08, 13:14:30
Hehe, genau die Aufgabe hatten wir in der Uni auch schonmal. Wir mußten es damals mit Haskel lösen, ist so eine funktionale Sprache. Ist ziemlich cool sowas, da muß man mal ganz anders denken als beim "normalen" imperativen Programmieren!

HellHorse
2004-06-08, 19:08:22
Original geschrieben von DocEW
Hehe, genau die Aufgabe hatten wir in der Uni auch schonmal. Wir mußten es damals mit Haskel lösen, ist so eine funktionale Sprache. Ist ziemlich cool sowas, da muß man mal ganz anders denken als beim "normalen" imperativen Programmieren!
Los, posten! ;)

DocEW
2004-06-08, 19:15:46
Original geschrieben von HellHorse
Los, posten! ;)
Uhhhh...muß ich mal suchen, keine Ahnung wo ich das habe... war vor 2 Jahren! :-)