Кто держит рыбок загадка эйнштейна
Перейти к содержимому

Кто держит рыбок загадка эйнштейна

  • автор:

Разгадка загадки Эйнштейна
http://akmych.org/various/einstein.html

5 разных человек в 5 разных домах разного цвета, курят 5 разных марок сигарет, выращивают 5 разных видов животных, пьют 5 разных видов напитков. Вопрос: кто выращивает рыбок?

  • Норвежец живет в первом доме.
  • Англичанин живет в красном доме.
  • Зеленый дом находится левее белого.
  • Датчанин пьет чай.
  • Тот, кто курит Rothmans, живет рядом с тем, кто
  • выращивает кошек.
  • Тот, кто живет в желтом доме, курит Dunhill.
  • Немец курит Marlboro.
  • Тот, кто живет в центре, пьет молоко.
  • Сосед того, кто курит Rothmans, пьет воду.
  • Тот, кто курит Pall Mall, выращивает птиц.
  • Швед выращивает собак.
  • Норвежец живет рядом с синим домом.
  • Тот, кто выращивает лошадей, живет в синем доме.
  • Тот, кто курит Philip Morris, пьет пиво.
  • В зеленом доме пьют кофе.

Итак, у нас есть 25 позиций, которые необходимо заполнить следующими данными:

  • Национальность: Норвежец, Англичанин, Датчанин, Немец, Швед.
  • Цвет дома: Красный, Зелёный, Белый, Жёлтый, Синий.
  • Марка сигарет: Ротманс, Данхилл, Мальборо, Пелл Мелл, Филипп Моррис.
  • Животное: Кошки, Птицы, Собаки, Лошади, Рыбки.
  • Напиток: Чай, Молоко, Вода, Пиво, Кофе.

По сути, нам надо заполнить вот такую табличку:

Номер дома 1 2 3 4 5
Национальность
Цвет дома
Сигареты
Животное
Напиток

Из подсказок сразу же заполняем ряд ячеек таблицы:

  • Норвежец живет в первом доме.
  • Норвежец живет рядом с синим домом.
  • Тот, кто выращивает лошадей, живет в синем доме.
  • Тот, кто живет в центре, пьет молоко.
Номер дома 1 2 3 4 5
Национальность Норвежец
Цвет дома Синий
Сигареты
Животное Лошади
Напиток Молоко

Раз англичанин живёт в красном доме, значит, норвежец в красном жить не может. Равно норвежец не может жить в синем. Не может он жить и в белом, так как зелёный дом находится левее белового, а дом норвежца — самый левый. В зелёном он тоже жить не может, так как справа от зелёного белый дом, а справа от норвежца — синий. Значит, он живёт в жёлтом. Отсюда же делаем и вывод, что норвежец курит Данхилл.

Номер дома 1 2 3 4 5
Национальность Норвежец
Цвет дома Жёлтый Синий
Сигареты Данхилл
Животное Лошади
Напиток Молоко

Далее, раз зелёный дом находится левее белого, значит, у него номер либо 3, либо 4. Однако в третьем, среднем, доме пьют молоко, а в зелёном доме пьют кофе — значит номер зелёного дома = 4. Значит, белый дом у нас идёт под номером 5, а красный — под номером 3. Здесь же живёт англичанин. Кофе пьют в 4 доме.

Номер дома 1 2 3 4 5
Национальность Норвежец Англичанин
Цвет дома Жёлтый Синий Красный Зелёный Белый
Сигареты Данхилл
Животное Лошади
Напиток Молоко Кофе

Далее, раз немец курит Мальборо, то он не курит Филипп Моррис, и потому не пьёт пиво. Не пьёт он и молоко, которое пьёт англичанин. Не пьёт и чай — это делает датчанин. Значит, немец пьёт либо воду, либо кофе. Норвежец не может пить пиво (он курит другие сигареты), молоко (не англичанин), кофе (живёт не в зелёном доме), чай (не датчанин). Значит норвежец пьёт воду, а потом немец пьёт кофе, и живёт в зелёном доме. Плюс не забываем, что немец курит Мальборо. И раз воду у нас пьёт норвежец, то его сосед (второй дом) курит Ротманс.

Номер дома 1 2 3 4 5
Национальность Норвежец Англичанин Немец
Цвет дома Жёлтый Синий Красный Зелёный Белый
Сигареты Данхилл Ротманс Мальборо
Животное Лошади
Напиток Вода Молоко Кофе

Раз швед у нас выращивает собак, то он не может жить во втором доме (там выращивают лошадей), значит он живёт в пятом доме (белом). Значит во втором доме живёт датчанин, который пьёт чай.

Номер дома 1 2 3 4 5
Национальность Норвежец Датчанин Англичанин Немец Швед
Цвет дома Жёлтый Синий Красный Зелёный Белый
Сигареты Данхилл Ротманс Мальборо
Животное Лошади Собаки
Напиток Вода Чай Молоко Кофе

Раз курильщик Пелл Мелл выращивает птиц, то это не швед, а значит — англичанин. Следовательно, швед курит Филипп Моррис и пьёт пиво.

Номер дома 1 2 3 4 5
Национальность Норвежец Датчанин Англичанин Немец Швед
Цвет дома Жёлтый Синий Красный Зелёный Белый
Сигареты Данхилл Ротманс Пелл Мелл Мальборо Филипп Моррис
Животное Лошади Птицы Собаки
Напиток Вода Чай Молоко Кофе Пиво

И теперь у нас осталась последняя подсказка:

  • Тот, кто курит Rothmans, живет рядом с тем, кто выращивает кошек.

Ротманс курит датчанин, что живёт во втором доме. Справа от него живёт англичанин, который выращивает птиц, значит, второй сосед датчанина (слева), норвежец, этих кошек и выращивает. А потом рыбок выращивает немец. Ответ найден.

Номер дома 1 2 3 4 5
Национальность Норвежец Датчанин Англичанин Немец Швед
Цвет дома Жёлтый Синий Красный Зелёный Белый
Сигареты Данхилл Ротманс Пелл Мелл Мальборо Филипп Моррис
Животное Кошки Лошади Птицы Рыбки Собаки
Напиток Вода Чай Молоко Кофе Пиво

ОТВЕТ: НЕМЕЦ

КТО ДЕРЖИТ РЫБКУ? Задачка от Эйнштейна.

1. Есть пять домов разного цвета: красный, зелёный, белый, жёлтый и синий.
2. Каждый населён человеком разной национальности: Немец, Швед, Датчанин,
Норвежец и Англичанин.
3. Каждый из них пьёт один вид напитков, курит одну марку сигарет и держит
одно домашнее животное.
4. Каждый из них уникален в пределах группы (напиток, марка сигарет,
животное не повторяется!)

Вопрос: Кто держит рыбку?

В ваших поисках Вам помогут следующие ключи:

1. Англичанин живёт в красном доме
2. Швед держит собаку
3. Датчанин пьёт чай
4. Зелёный дом — налево от белого, и
5. его жилец пьёт кофе
6. Курильщик Pall Mall держит птичку
7. Жилец дома, находящегося в середине пьёт молоко
8. Жилец желтого дома курит Dunhill
9. Норвежец живёт в первом доме
10. Курильщик Marlboro живёт рядом с владельцем кота
11. Владелец лошади живёт рядом с курильщиком Dunhill
12. Курильщик Winfield пьёт пиво
13. Дом Норвежца — рядом с синим домом
14. Немец курит Rothmans
15. Курильщик Marlboro живёт рядом с тем, кто пьёт воду

Дополнен 15 лет назад
Интересен ход рассуждений, а не ответ. Загадке 100 лет с гаком, так и есть)))
Дополнен 15 лет назад
Ирина, спасибо! :))
Лучший ответ

Немец, немец держит рыбку. 1. В первом доме норвежец
2. значит, второй дом синий,
3. жилец третьего (среднего) дома пьет молоко
4. 4-й дом или зеленый или белый (см. условия и расположение домиков) , и там не живет англичанин, а раз житель 3-го дома пьет молоко, то дом № 4 – не белый, а зеленый, и, соответственно, там пьют кофе, значит, четвертом доме не датчанин (т. к. пьет кофе)
5. Значит, дом № 5 – белый (т. к. слева от зеленого) .
6. А в доме № 3 живет англичанин и он красный,
7. Получается, дом № 1 – желтый и в нем курят Dunhill, и пьют воду (т. к. не датчанин – не чай, молоко и кофе занято, а курит не Winfield, значит не пиво)
8. А в доме № 2 – лошадь, и там курят Marlboro, т. к. живут рядом с тем, кто пьёт воду
9. В третьем доме не датчанин (т. к. пьет молоко) и не курит Winfield (опять молоко) .
10. В доме № 1 – кот, т. к. «Курильщик Marlboro живёт рядом с владельцем кота – дом № 2» и кот мог бы жить в доме № 3, но «курильщик PallMall держит птичку» , а в доме № 1 курят Dunhill.
11. В доме № 2 живет датчанин (т. к. лошадь, значит не швед, у которого собака, и курит Marlboro, значит не немец, остальные заняты) , и он пьет чай, значит в доме № 5 пьют пиво и курят Winfield
12. В доме № 4 живет немец (т. к. в доме № 5 курят Winfield, а в доме № 3 — англичанин) и курит Rothmans
13. Поэтому в доме № 3 курят PallMall и держат птичку,
14. в доме № 5 – швед с собакой
15. И в доме № 3 немец, у которого рыбка.

Остальные ответы
да уж! а ответ будет?
этой загадке уже 100 лет 🙂 вон уже наизусть помнят ответ — норвежец
А я хочу чтоб рыбку держал немец)))))))))))
да действительно, ей уже 100 лет! а по интересней что то будеь?
Кого хотите обмануть?
загадке 100000000 лет
Не хитрыми вычислениями и обмозгованиями, которые взорвали мне мозг похоже что это Норвежец
Насколько я помню правильный ответ — немец
А при чем тут рыбка?
В тяпницу и такую задачу.
Немец!
Смешно, но Энштейн оказался прав!
очень спешу, но решитиь можно

Рыбку держит немец.
возьмите лист бумаги. и все решается
Логика такая: сначала подставляю только совпадения. Потом смотрю кому чего не хватает и у кого, что есть. Начинаю подставлять и опять свериваться с условиями. Сначала получилось выставить дома, а потом уже и всё вместе собралось!

ЗАГАДКА ЭЙНШТЕЙНА, А МОЖЕТ БЫТЬ И КЭРРОЛЛА НА НОВЫЙ ЛАД 😉
Решение логических задач табличным способом

Алиса в стране чудес (иллюстрация к сказке) :: Маргарет Таррант

Алиса в стране чудес
иллюстрация к сказке
Маргарет Таррант

Предлагаю вниманию читателей зелёных страничек логическую задачу в основу которой легла легендарная загадка Эйнштейна.
Согласно одной из многочисленных легенд, окутывающих образ гениального физика всех времён и народов, сочинил он её ещё в глубоком детстве.
Впрочем, иногда авторство этой задачи приписывается Льюису Кэрроллу – английскому математику и писателю, автору восхитительно экстравагантных сказок «Алиса в стране чудес» и «Алиса в Зазеркалье», прочтение которых разбивает в пух и прах самые крепкие умы и заставляет замирать в почтенном страхе любителей самых неподражаемых логических изысков 😉

В своём самом тяжеловесном варианте эта логическая задача (загадка Эйнштейна, а может быть и Кэрролла) предполагает решение с помощью рассуждений, без использования каких-либо записей.
Мы с вами малость схитрим и будем решать эту задачу табличным способом.
Условие задачи, а также результаты наших рассуждений будем фиксировать с помощью специально составленной таблицы.
По сложившейся традиции зелёных страничек побалуем себя живописью 😉

Маргарет Таррант (Margaret Tarrant; 1888–1959) – английская художница – иллюстратор детских сказок.

Условие задачи:
На улице стоят подряд 5 домов разного цвета в которых живут 5 человек разной национальности, они выращивают 5 разных плодовых кустарников, занимаются разведением 5 разных животных и отдают предпочтение 5 разным напиткам.
При этом:

  • Норвежец живёт в первом доме
  • Француз живёт в красном доме
  • Зелёный дом находится левее белого
  • Армянин пьёт чай
  • Тот, кто выращивает смородину, живёт рядом с тем, кто разводит кошек
  • Тот, кто живёт в жёлтом доме, выращивает малину
  • Сириец выращивает ежевику
  • Тот, кто живёт в центре, пьёт молоко
  • Сосед того, кто выращивает смородину, пьёт айран
  • Тот, кто выращивает голубику, занимается разведением попугаев
  • Немец разводит собак
  • Норвежец живёт рядом с синим домом
  • Тот, кто разводит кроликов, живёт в синем доме
  • Тот, кто выращивает крыжовник, пьёт ряженку
  • В зелёном доме пьют кофе

Вопрос: Кто разводит рыбок?

Решение загадки Эйнштейна табличным способом

Для начала определимся с каждой пятёркой данных, используя условие задачи:

  • национальность: норвежец, француз, армянин, сириец, немец
  • цвет дома: красный, зелёный, белый, жёлтый, синий
  • кустарник: смородина, малина, ежевика, голубика, крыжовник
  • животное: кошки, попугаи, собаки, кролики, рыбки
  • напиток: чай, молоко, айран, ряженка, кофе

Систематизируем эти данные, используя специально составленную таблицу.
Дома условно прономеруем и определимся с тем, где у нас лево, а где право 😉
В таблице будем фиксировать наши с вами рассуждения.

Кто разводит рыбок? Или решение загадки Эйнштейна регулярным языком

Многие сталкивались с головоломкой про пять разноцветных домов, в каждом из которых живет человек со своими любимыми животным, напитком и сигаретами. Эта загадка приписывается Эйнштейну, хотя прямых подтверждений этому нет. Полный текст этой головоломки есть на википедии.

Ее можно решить на бумаге или в уме, последовательно исключая неподходящие варианты. Однако, ее также можно решить более технично. Один из способов — написать программку на прологе. Но здесь я хочу ее решить используя более простые механизмы — регулярные выражения. А именно, перевести условия загадки на язык регекспов и свести задачу к поиску подходящей строки во всем допустимом наборе строк. Кстати, этот набор строк показан на рисунке.

Идея

Сама идея не моя, услышал ее в одной видеолекции. Однако, там ее решали слишком уж изощренно. Я попытался решить ее более просто и прямолинейно.

  1. Норвежец живёт в первом доме.
  2. Англичанин живёт в красном доме.
  3. Зелёный дом находится слева от белого, рядом с ним.
  4. Датчанин пьёт чай
  5. Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек.
  6. Тот, кто живёт в жёлтом доме, курит Dunhill.
  7. Немец курит Rothmans.
  8. Тот, кто живёт в центре, пьёт молоко.
  9. Сосед того, кто курит Marlboro, пьёт воду.
  10. Тот, кто курит Pall Mall, выращивает птиц.
  11. Швед выращивает собак.
  12. Норвежец живёт рядом с синим домом.
  13. Тот, кто выращивает лошадей, живёт в синем доме.
  14. Тот, кто курит Winfield, пьет пиво.
  15. В зелёном доме пьют кофе.

Чтобы решить задачу нужно найти такую последовательность домов, цветов, национальностей, напитков и сигарет, чтобы они удовлетворяли правилам выше

И так, что и где мы будем искать. Для начала нужно каким-то образом формализовать правила. У нас пять домов, цветов, национальностей, напитков, животных и сигарет. Произвольный вариант дома с «жильцами» может выглядеть так:

german white cat beer malboro 

Но этого недостаточно, так как у нас есть правила, которые учитывают взаимное расположение домов и предметов в них (к примеру, правила: 1, 3, 5. ). Учтем это, расположив в строке пять домов последовательно:

german white cat beer malboro englishman red dog water pallmall norwegian green fish milk winfield dane blue bird tea dunhill swede horse yellow coffee rothmans 

Строка выше — один из вариантов расположения предметов. В данном случае, неверный. Если же мы составим все возможные варианты, и поместим это в один текст, получится следующее:

n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s n c a d s . 

Где n — nation, c — color, a — animal, d — drink, s — cigarettes. И каждая из этих букв может принимать одно из пяти своих значений.

  1. ^norwegian \w+
  2. \w+ englishman red \w+
  3. \w+ dane \w \w tea \w+
  4. .

Но есть плохая новость. Текст, по которому будет проходить поиск может быть ОЧЕНЬ большим. Если точнее, он будет размером (5!)^5 строк (~24 миллиардов). Его не то чтобы проверить, его будет сложно даже сгенерировать. Но есть и хорошая новость. Мы можем не генерировать весь этот текст, а воспользоваться операцией пересечения регулярных выражений. То есть найдем все общие строки регулярного выражения * (все возможные строки), с теми строками, которые дают регулярные выражения правил задачи. Та строка (а может и строки) что останется после пересечения и будет решением задачи.

К сожалению я не знаю движков, способных пересекать регулярные выражения. По этому придется использовать напрямую конечные автоматы, лежащие в основе любого регекспа.

Реализация

Конечные автоматы буду строить с помощью библиотечки openfst. Она дает все что мне необходимо для построения автоматов, плюс удобный способ работы из шелла. Чтобы сделать программирование еще более «ненормальным», я вообще не буду программировать :). За исключением простых bash-скриптов кода не будет.

Шаг 1 — Строим базовые автоматы

Создадим текстовый файл со списком всех объектов. Это будет наш алфавит.

norwegian englishman dane german swede white red . 

Построим базовые автоматы, каждый из которых допускает только одно слово из алфавита.

j=1 for i in `cat alph`; do echo -e "0 1 $j\n1" | fstcompile --acceptor > $i ((j=$j+1)) done 

fstcompile — команда пакета openfst, компилирующая текстовое представление автомата в бинарное. Это нужно для того, чтобы потом применять к этому автомату различные операции.

И так, у нас появился список файлов-автоматов. Они очень тривиальны. К примеру, автомат beer будет выглядить так:

Он эквивалентен регулярному выражению «beer». Пока все довольно просто. Кроме того нам понадобятся еще два базовых автомата — пустое множество, и любая строка, т.е. звездочка *. Строим.

Шаг 2 — Строим пустой автомат и звездочку

Пустая строка, автомат ’empty’:

 echo '0' | fstcompile --acceptor > empty 

Звездочка, автомат ‘star’:

cp empty star for i in `cat alph`; do fstunion star $i star done fstclosure star star 

Последний делается простым объединением базовых автоматов и замыканием. В регулярных выражениях это всего лишь (englishman|dane|. |cat|dog|. )*. Этот автомат будет таким:

Шаг 3 — Строим дома

Правила будет удобней описывать, если создать более комплексные автоматы, такие как национальность, цвет и т.д. Опять, использую несложный скрипт:

c="./concat.sh" $c norwegian star > r1 $c star englishman red star > r2 $c star animal drink cigarette nation star > r3 $c star dane color animal tea star > r4 $c star malboro nation color cat star > r5_0 $c star cat drink cigarette nation color animal drink malboro star > r5_1 $c star yellow animal drink dunhill star > r6 $c star german color animal drink rothmans > r7 $c house house nation color animal milk cigarette house house > r8 $c star malboro nation color animal water star > r9_0 $c star water cigarette nation color animal drink malboro star > r9_1 $c star bird drink pallmall star > r10 $c star swede color dog star > r11 $c star norwegian color animal drink cigarette nation blue star > r12_0 $c star blue animal drink cigarette norwegian star > r12_1 $c star blue horse star > r13 $c star beer winfield star > r14 $c star green animal coffee star > r15 fstunion r5_0 r5_1 > r5 fstunion r9_0 r9_1 > r9 fstunion r12_0 r12_1 > r12 

Правила 5, 9 и 12 являются составными. Я определяю каждую часть отдельно, а потом делаю объединение. Скрипт concat.sh всего лишь делает конкатинацию автоматов, переданных в аргументах:

cp empty _c for i in $*; do fstconcat _c $i _c done; cat _c; rm _c; 

Итак, на выходе получим автоматы r1,r2. r15. Все готово для финального шага.

Шаг последний — Пересечение

./intersect.sh r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 > result 

Где intersect.sh — пересечение автоматов в аргументах.

cp cl _c for i in $*; do fstintersect _c $i _c done; cat _c; rm _c; 

На этом можно было бы и закончить — посмотреть автомат и узнать у кого рыба. Но я с самого начала не учел одну вещь — в моих правилах каждое из слов может повторятся. К примеру, два человека могут пить одно пиво и заводить одно животное. Это неверно по условиям задачи. Создавать такой фильтр крайне неудобно, используя регулярные языки, т.к. у нас нет способа «запомнить», что такое слово уже было. Но ограничить как-то нужно. По этому подвергаем финальный результат следующему скрипту.

i="./intersect.sh" d="fstdifference" for i in `cat alph`; do fstdifference cl $i > differ fstconcat differ $i | fstconcat - differ | fstrmepsilon - | fstdeterminize - | fstminimize - > $_cont done cp result out for i in `ls *_cont`; do echo $i fstintersect $i out | fstrmepsilon - | fstdeterminize - | fstminimize - out done rm differ rm *_cont 

Этот скрипт формирует специальный авотомат для каждого слова из алфавита, и применяет его к результату. Таким образом, отметаются пути с повторяющимися словами. В итоге, финальный результат (а по сути, автомат ‘out’) выглядит так:

Это частичное изображение автомата (все не влезло). Каждые пять слов определяют дом. Как видно из рисунка, немец разводит рыбок.

Заключение

Вот такой вот необычный способ решения задачи. Но кроме всего прочего он показывает, что регулярные языки — это довольно мощная штука. Более того, если верить Ульману, любую математическую проблему можно представить как нахождения строки в определенном языке. Что и было показано.

ps и да, мьсе действительно знает толк в извращениях 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *