Привет. Наверняка вы уже слышали про загадку Эйнштейна. Она же загадка Льюиса Кэролла, хотя нет никаких данных, что ее придумал ни тот, ни другой.
На википедии доступна фотография первой печатной статьи с этой задачкой в журнале Life от 1962 года, ниже будет перевод.
Возможно, эта логическая задачка носит имя Эйнштейна из-за его рассуждений, что только один из 50 людей может решить эту задачку в уме, так как нужно оперировать пятью различными признаками.
Забавно, на английском эта задача называется Zebra puzzle - задача про зебру.
Предлагаю вам попробовать сначала решить задачку в уме, а если не получится, мы сделаем специальную форму в Эксель, которая поможет с решением. Поехали?
Условия задачи
1. На улице стоят пять домов.
2. Англичанин живёт в красном доме.
3. У испанца есть собака.
4. В зелёном доме пьют кофе.
5. Украинец пьёт чай.
6. Зелёный дом стоит сразу справа от белого дома.
7. Тот, кто курит Old Gold, разводит улиток.
8. В жёлтом доме курят Kool.
9. В центральном доме пьют молоко.
10. Норвежец живёт в первом доме.
11. Сосед того, кто курит Chesterfield, держит лису.
12. В доме по соседству с тем, в котором держат лошадь, курят Kool.
13. Тот, кто курит Lucky Strike, пьёт апельсиновый сок.
14. Японец курит Parliament.
15. Норвежец живёт рядом с синим домом.
Кто пьёт воду? Кто держит зебру?
В целях ясности следует добавить, что каждый из пяти домов окрашен в свой цвет, а их жители — разных национальностей, владеют разными животными, пьют разные напитки и курят разные марки американских сигарет. Ещё одно замечание: в утверждении 6 справа означает справа относительно вас.
Некоторые посылки из условия задачи очевидны, например:
Осатльные признаки нужно найти с помощью дедукции. Попробуйте порассуждать!
Делаем помощника для решения
Если вы не входите в 2% тех, кто может решить задачу в уме, то вам понадобится куда-нибудь записывать свои рассуждения. Сделаем это в эксель.
Смотрите видео - или читайте статью, как вам удобнее!
Сначала выпишем на отдельной вкладке все возможные параметры - цвет, напиток, животное, сигареты, национальность:
На основной вкладке расчертим табличку:
Слева мы разместили рабочую область, где можно будет указать значения параметров, справа - условия задачи для наглядности. Как "нулевое" правило, я добавил неявное указание, что все параметры уникальные, не повторяются.
С помощью инструмента "Проверка данных" (подробнее о нем можно почитать здесь и здесь) добавим выпадающий список для каждой строки рабочей области, взяв данные из списка во второй вкладке.
Теперь добавим ряд проверок, чтобы показывать соответствие введенных данных условиям задачи:
В C24 укажем формулу:
=ЕСНД(ПОИСКОПЗ(B24;$B$2:$F$2;0);"")
=IFNA(MATCH(B24;$B$2:$F$2;0);"")
И растянем эту формулу вниз. Только для каждой новой группы параметров нам нужно поменять диапазон, в котором мы ищем. Для цвета дома: $B$2:$F$2, для напитка: $B$3:$F$3, для животного $B$4:$F$4 и так далее.
Эта формула показывает номер дома, для которого указан параметр (цвет, напиток, животное, сигареты, национальность). Если этот праметр не указан, то ошибка отлавливается с помощью функции ЕСНД (IFNA), и возвращается пустая строка. Если параметр указан несколько раз - определяется только первый дом, для которого он указан.
В D24 укажем формулу:
=ЕСЛИ(C24="";"";СЧЁТЕСЛИ($B$2:$F$6;B24)<2)
=IF(C24="";"";COUNTIF($B$2:$F$6;B24)<2)
И скопируем эту формулу вниз. Формула возвращает ИСТИНА (TRUE), если параметр указан в таблице один раз, ЛОЖЬ (FALSE), если два или более, и ничего, если не указан.
Вот что получается:
Было бы здорово, если бы в табличке тоже подсвечивалось, если мы что-то ввели повторяющееся. Добавим условное форматирование - пометить красным дубликаты.
Запишем теперь правила в виде формул - разместим их там же, где и проверка на повторение в соседних колонках. Номер правила можно поставить в заглавии колонки, чтобы было видно:
Сами формулы переписывать здесь не буду, покажу только картинкой. Укажу лишь несколько:
Для ячейки E27 (правило номер 2, проверка параметра "красный")
- =ЕСЛИ(C27="";"";C27=C44) или на английском =IF(C27="";"";C27=C44)
Для ячейки N34
=ЕСЛИ($C$34="";"";ЕСЛИ($C$42="";ЛОЖЬ;OR($C$34=$C$42+1;$C$34=$C$42-1)))
или на английском
- =IF($C$34="";"";IF($C$42="";FALSE;OR($C$34=$C$42+1;$C$34=$C$42-1)))
Если будет желание, можете посмотреть в конце статьи будет выложен готовый файл Эксель:
Эти формулы напротив соответствующего параметра будут показывать ИСТИНА, ЛОЖЬ или пустую ячейку, в зависимости от того, выполняется правило или нет, или если данные не введены.
Кстати, было бы здорово, подсвечивать правила зеленым или красным - в зависимости от того, правильно заполнены данные или нет. Для этого справа от правил сделаем две колонки: в первой мы будем считать количество "ЛОЖЬ" в соответствующем правиле. Формула для первой колонки:
=СЧЁТЕСЛИ(СМЕЩ($D$24;0;СТРОКА()-1;25;1);ЛОЖЬ)
=COUNTIF(OFFSET($D$24;0;ROW()-1;25;1);FALSE)
А во второй - количиство "ИСТИНА". Формула для второй колнки отличается только тем, что вместо ЛОЖЬ там ИСТИНА :
=СЧЁТЕСЛИ(СМЕЩ($D$24;0;СТРОКА()-1;25;1);ИСТИНА)
=COUNTIF(OFFSET($D$24;0;ROW()-1;25;1);TRUE)
Осталось добавить два правила для условного форматирования. Пометить красным правила, если в соседней ячейке в колонке T число больше нуля (и не продолжать другие правила). Пометить зеленым, если в соседней ячейке в колонке U число больше 0.
На этом все! Инструмент готов :-) Его можно скачать по ссылке: https://yadi.sk/i/hY37WqhqEIuY4A
Напишите в комментариях, если у вас появлились вопросы или вы знаете более элегантный способ решения этой задачки.