кто же разводит рыбок?
Jul. 3rd, 2002 10:21 pmУвидел в очередной раз так называемую "загадку Эйнштейна" в записи
quantum_angel и решил на этот раз её решить. Долго думал, но никак не получалось увидеть форсированный путь к решению. Удивился. Написал программку, чтобы умно перебрала и нашла все решения, и что же оказалось? Что есть четыре разных решения, в трёх из которых рыбок разводит англичанин, а в одной - датчанин. Вот они:
1.
В первом, зелёном, доме живёт норвежец, пьёт кофе, курит Pall Mall, разводит птиц.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит кошек.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Rothmans, разводит рыбок.
В четвёртом, синем, доме живёт немец, пьёт воду, курит Marlboro, разводит лошадей.
В пятом, белом, доме живёт швед, пьёт пиво, курит Phillip Morris, разводит собак.
2.
В первом, синем, доме живёт норвежец, пьёт пиво, курит Phillip Morris, разводит лошадей.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит рыбок.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Pall Mall, разводит птиц.
В четвёртом, зелёном, доме живёт швед, пьёт кофе, курит Rothmans, разводит собак.
В пятом, белом, доме живёт немец, пьёт воду, курит Marlboro, разводит кошек.
3.
В первом, синем, доме живёт норвежец, пьёт пиво, курит Phillip Morris, разводит лошадей.
Во втором, жёлтом, доме живёт швед, пьёт воду, курит Dunhill, разводит собак.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Rothmans, разводит рыбок.
В четвёртом, зелёном, доме живёт немец, пьёт кофе, курит Marlboro, разводит кошек.
В пятом, белом, доме живёт датчанин, пьёт чай, курит Pall Mall, разводит птиц.
4.
В первом, зелёном, доме живёт норвежец, пьёт кофе, курит Pall Mall, разводит птиц.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит кошек.
В третьем, белом, доме живёт швед, пьёт молоко, курит Rothmans, разводит собак.
В четвёртом, синем, доме живёт немец, пьёт воду, курит Marlboro, разводит лошадей.
В пятом, красном, доме живёт англичанин, пьёт пиво, курит Phillip Morris, разводит рыбок.
По-видимому, условие было несколько искажено в переводе/передаче из рук в руки, из книг в книги, из веб-страницы на веб-страницу и т.п.
Ну хорошо. Решил взять какое-нибудь условие по-английски и посмотреть, что будет там. Взял условие с этой страницы. Правила номер 12 и 13 там другие, а остальные идентичные (кроме названий двух марок сигарет, что ничего не меняет в данном случае). Запустил. Получилось уже семь решений, рыбок в которых попеременно разводят датчанин, норвежец и немец. На той странице ответ только один - немец, но он является только одним из семи возможных.
Наконец, нашёл ещё одну страницу с подробным объяснением решения. Условие (по-английски) на ней такое же, как на предыдущей, только опять изменены немного марки сигарет (какая-то странная обсессия на марках сигарет, ей-богу). Но чтение решения наконец всё прояснило: в условии номер 3 (в русской нумерации как у
quantum_angel; на английской странице это условие номер 4) имеется в виду, что зелёный дом стоит слева от белого дома, рядом с ним; я же понял русское условие "Зеленый дом находится левее белого" как то, что он находится по левую руку, но необязательно рядом. Если бы я сразу читал английский вариант с его "on the left", то понял бы правильно. Опять проблема перевода!
Запустив заново программу с правильным условием, я действительно получил единственный ответ. Но русский набор правил, как у
quantum_angel, не даёт единственного ответа даже если исправить условие номер 3: всё равно выходят два решения с англичанином и датчанином. Необходимо исправить условия 12 и 13 по образцу соответствующих английских, и тогда всё становится на свои места. Вот исправленное условие по-русски, и единственное подходящее к нему решение:
1. Норвежец живет в первом доме.
2. Англичанин живет в красном доме.
3. Зеленый дом находится по левую руку от белого, рядом с ним.
4. Датчанин пьёт чай.
5. Тот, кто курит Rothmans, живет рядом с тем, кто выращивает кошек.
6. Тот, кто живет в желтом доме, курит Dunhill.
7. Немец курит Marlboro.
8. Тот кто живет в центре, пьёт молоко.
9. Сосед того, кто курит Rothmans, пьёт воду.
10. Тот, кто курит Pall Mall, выращивает птиц.
11. Швед выращивает собак.
12. Норвежец живет рядом с синим домом.
13. Тот, кто выращивает лошадей, живет рядом с тем, кто курит Dunhill.
14. Тот, кто курит Philip Morris, пьёт пиво.
15. В зеленом доме пьют кофе.
Решение:
В первом, жёлтом, доме живёт норвежец, пьёт воду, курит Dunhill, разводит кошек.
Во втором, синем, доме живёт датчанин, пьёт чай, курит Rothmans, разводит лошадей.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Pall Mall, разводит птиц.
В четвёртом, зелёном, доме живёт немец, пьёт кофе, курит Marlboro, разводит рыбок.
В пятом, белом, доме живёт швед, пьёт пиво, курит Phillip Morris, разводит собак.
Откуда взялась неправильная русская версия? Не знаю. Сетевым поиском находятся две страницы (1, 2) с неправильным текстом и несколько с правильным, например здесь, где также обсуждают вопрос о двусмысленности условия.
По сути дела эта задачка является одной из таких задач, которые забавно прочесть, но редко кто собственно решает. Поэтому искажённое условие в принципе может путешествовать по сети, переходить из языка в язык и т.п. - то, что оно неверное, оказывается не таким уж важным фактом. Забавно.
1.
В первом, зелёном, доме живёт норвежец, пьёт кофе, курит Pall Mall, разводит птиц.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит кошек.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Rothmans, разводит рыбок.
В четвёртом, синем, доме живёт немец, пьёт воду, курит Marlboro, разводит лошадей.
В пятом, белом, доме живёт швед, пьёт пиво, курит Phillip Morris, разводит собак.
2.
В первом, синем, доме живёт норвежец, пьёт пиво, курит Phillip Morris, разводит лошадей.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит рыбок.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Pall Mall, разводит птиц.
В четвёртом, зелёном, доме живёт швед, пьёт кофе, курит Rothmans, разводит собак.
В пятом, белом, доме живёт немец, пьёт воду, курит Marlboro, разводит кошек.
3.
В первом, синем, доме живёт норвежец, пьёт пиво, курит Phillip Morris, разводит лошадей.
Во втором, жёлтом, доме живёт швед, пьёт воду, курит Dunhill, разводит собак.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Rothmans, разводит рыбок.
В четвёртом, зелёном, доме живёт немец, пьёт кофе, курит Marlboro, разводит кошек.
В пятом, белом, доме живёт датчанин, пьёт чай, курит Pall Mall, разводит птиц.
4.
В первом, зелёном, доме живёт норвежец, пьёт кофе, курит Pall Mall, разводит птиц.
Во втором, жёлтом, доме живёт датчанин, пьёт чай, курит Dunhill, разводит кошек.
В третьем, белом, доме живёт швед, пьёт молоко, курит Rothmans, разводит собак.
В четвёртом, синем, доме живёт немец, пьёт воду, курит Marlboro, разводит лошадей.
В пятом, красном, доме живёт англичанин, пьёт пиво, курит Phillip Morris, разводит рыбок.
По-видимому, условие было несколько искажено в переводе/передаче из рук в руки, из книг в книги, из веб-страницы на веб-страницу и т.п.
Ну хорошо. Решил взять какое-нибудь условие по-английски и посмотреть, что будет там. Взял условие с этой страницы. Правила номер 12 и 13 там другие, а остальные идентичные (кроме названий двух марок сигарет, что ничего не меняет в данном случае). Запустил. Получилось уже семь решений, рыбок в которых попеременно разводят датчанин, норвежец и немец. На той странице ответ только один - немец, но он является только одним из семи возможных.
Наконец, нашёл ещё одну страницу с подробным объяснением решения. Условие (по-английски) на ней такое же, как на предыдущей, только опять изменены немного марки сигарет (какая-то странная обсессия на марках сигарет, ей-богу). Но чтение решения наконец всё прояснило: в условии номер 3 (в русской нумерации как у
Запустив заново программу с правильным условием, я действительно получил единственный ответ. Но русский набор правил, как у
1. Норвежец живет в первом доме.
2. Англичанин живет в красном доме.
3. Зеленый дом находится по левую руку от белого, рядом с ним.
4. Датчанин пьёт чай.
5. Тот, кто курит Rothmans, живет рядом с тем, кто выращивает кошек.
6. Тот, кто живет в желтом доме, курит Dunhill.
7. Немец курит Marlboro.
8. Тот кто живет в центре, пьёт молоко.
9. Сосед того, кто курит Rothmans, пьёт воду.
10. Тот, кто курит Pall Mall, выращивает птиц.
11. Швед выращивает собак.
12. Норвежец живет рядом с синим домом.
13. Тот, кто выращивает лошадей, живет рядом с тем, кто курит Dunhill.
14. Тот, кто курит Philip Morris, пьёт пиво.
15. В зеленом доме пьют кофе.
Решение:
В первом, жёлтом, доме живёт норвежец, пьёт воду, курит Dunhill, разводит кошек.
Во втором, синем, доме живёт датчанин, пьёт чай, курит Rothmans, разводит лошадей.
В третьем, красном, доме живёт англичанин, пьёт молоко, курит Pall Mall, разводит птиц.
В четвёртом, зелёном, доме живёт немец, пьёт кофе, курит Marlboro, разводит рыбок.
В пятом, белом, доме живёт швед, пьёт пиво, курит Phillip Morris, разводит собак.
Откуда взялась неправильная русская версия? Не знаю. Сетевым поиском находятся две страницы (1, 2) с неправильным текстом и несколько с правильным, например здесь, где также обсуждают вопрос о двусмысленности условия.
По сути дела эта задачка является одной из таких задач, которые забавно прочесть, но редко кто собственно решает. Поэтому искажённое условие в принципе может путешествовать по сети, переходить из языка в язык и т.п. - то, что оно неверное, оказывается не таким уж важным фактом. Забавно.
no subject
Date: 2002-07-03 12:32 pm (UTC)no subject
Date: 2002-07-03 01:26 pm (UTC)не так уж много свободного времени, но
Date: 2002-07-03 01:28 pm (UTC)no subject
Date: 2002-07-03 01:44 pm (UTC)no subject
Date: 2002-07-03 01:50 pm (UTC)http://www.cs.duke.edu/~mlittman/topics/sat.html
Re:
Date: 2002-07-03 01:51 pm (UTC)Числа 0..24 кодируют все 25 возможных свойств. Функция recurse последовательно строит последовательность выбора, которая является списком домов для первых N свойств. Члены последовательности - числа от 1 до 5, номера домов слева направо. Функция choice возвращает 1, если выбранные до сих пор свойства не нарушают поставленных условий. Т.к. она вызывается на каждом шаге рекурсии, подавляющее большинство неверных вариантов отрубаются близко к началу и поэтому дерево перебора получается небольшим. Первое длинное условие в функции choice проверяет, что каждые 5 свойств действительно попадают в 5 разных домов. Комментами #1, #2 и т.д. пронумерованы условия задачи, причём 3, 12 и 13 исправлены на верные.
sub different { my ($v1, $v2, $v3, $v4, $v5) = @_; return 1 unless $v1 && $v2 && $v3 && $v4 && $v5; return 0 if $v1==$v2 || $v1==$v3 || $v1==$v4 || $v1==$v5 || $v2==$v3 || $v2==$v4 || $v2==$v5 || $v3==$v4 || $v3==$v5 || $v4==$v5; return 1; } sub eq2 { my ($v1, $v2) = @_; return 1 unless $v1 && $v2 && $v1!=$v2; return 0; } sub near { my ($v1, $v2) = @_; return 1 unless $v1 && $v2; return 1 if ($v1-$v2==1) || ($v2-$v1==1); return 0; } sub correct { my $choice=shift; my @list = @$choice; return 0 unless different(@list[0..4]) && different(@list[5..9]) && different(@list[10..14]) && different(@list[15..19]) && different(@list[20..24]); #1 return 0 unless eq2($list[0], 1); #2 return 0 unless eq2($list[1], $list[5]); #3 # return 0 if $list[6] && $list[7] && $list[6]>$list[7]; return 0 if $list[6] && $list[7] && $list[7]-$list[6]!=1; #4 return 0 unless eq2($list[2], $list[10]); #5 return 0 unless near($list[15], $list[20]); #6 return 0 unless eq2($list[8], $list[16]); #7 return 0 unless eq2($list[3], $list[17]); #8 return 0 unless eq2($list[11], 3); #9 return 0 unless near($list[15], $list[12]); #10 return 0 unless eq2($list[18], $list[21]); #11 return 0 unless eq2($list[22], $list[4]); #12 # return 0 unless near($list[0], $list[8]); return 0 unless near($list[0], $list[9]); #13 # return 0 unless eq2($list[23], $list[9]); return 0 unless near($list[23], $list[16]); #14 return 0 unless eq2($list[19], $list[13]); #15 return 0 unless eq2($list[6], $list[14]); return 1; } my $tries = 0; sub recurse { my $choice = shift; $tries++; if ($tries % 100 == 0) { print "$tries " }; if (scalar(@$choice)==25) { print "reached 25:\n"; foreach my $num (1..5) { print("$num : "); foreach(0..scalar(@$choice)-1) { print "$_ " if $$choice[$_]==$num; } print " "; }; print "\n"; return; } foreach(1..5) { push @$choice, $_; if(correct($choice)) { recurse($choice); } pop @$choice; } return; } recurse(\());no subject
Date: 2002-07-03 01:51 pm (UTC)Re:
Date: 2002-07-03 01:52 pm (UTC)no subject
Date: 2002-07-03 03:03 pm (UTC)http://www.kaser.com/sherwin.html
no subject
Date: 2002-07-03 05:51 pm (UTC)Мне попались правильные (русские) условия, но тоже с идиотстким "слева" без "рядом". К счастью, была приписка, что ответ единственный и система условий полная, поэтому 10 минут ушло на решение вопроса "думать самой или писать программку", еще 5 -- на определение, где находится "слева", ну и 20 -- на собственно решение.
btw, к созреванию Вашего мнения о фильме Рене, я тоже успею посмотреть еще раз:-)
no subject
Date: 2002-07-04 02:11 am (UTC)http://www.livejournal.com/talkread.bml?journal=vries&itemid=1806
no subject
Date: 2002-07-04 03:06 am (UTC)no subject
So, on the next lesson I came with the solution and found that:
1. I was the only one to come up with the correct solution, since I was the only one who bothered to look in the book.
2. 30% didn't solve the problem at all.
3. 70% came up with one of the two solutions, each of which, given the original statements the teacher had supplied, led to a paradox and neither of which was the correct one.
4. half of the students were bugging the teacher on every opportunity on the days between the lessons because they found the paradox and suspected she made an error reading one or more of the statements.
5. the teacher did not allow herself be bugged and repeatedly stated that all statements were correct and that she doesn't have the time for the students.
6. When the students found out that she had indeed misread one of the statements, they started screaming on the teacher and the teacher started screaming back at them, then asked me how I reached the correct solution, to which I honestly replied that I looked at the problem in the book and she used it as an argument against all the others-- that they should have looked it up in the book and that's the end of the story.
7. Half of the students continued to scream at her even after that, while the other half ran a game of Doom on the network.
8. The teacher noticed some of the students were playing Doom on the network, banged on the table and turned all computers off with the central switch. Thereafter, she turned it on and proceeded to explain how to write the program which solves the problem in Prolog.
yeah... school was a crazy thing and i'm glad i'm not there... anyway, i ran into many versions of this problem since then, and there are no difficulties if there are no typos or things like that-- it's just a matter of how well you draw the diagram. not something more than half an hour should be dedicated to.
Re:
Date: 2002-07-04 05:57 am (UTC)Эйнштейн ведь - символ "учёности" 20-го века.
А задача знаменита - ну не знаю чем, просто самая известная из логических задач такого рода.
no subject
Date: 2002-07-04 07:31 am (UTC)no subject
Date: 2002-07-08 02:56 am (UTC)http://www.livejournal.com/talkread.bml?journal=yurkennis&itemid=59272
Re:
Date: 2002-07-08 04:44 am (UTC)no subject
Date: 2002-07-08 06:55 am (UTC)http://www.livejournal.com/talkpost.bml?journal=nezhit&itemid=185426
но в итоге - тоже немец :)
Re:
Date: 2002-07-08 07:08 am (UTC)no subject
Date: 2002-07-08 07:18 am (UTC)кстати
но программный подход конечно рулит, авва вы молодец :)