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 :)
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 :)