Реально сложные задачи

Если вы люби­те поло­мать мозг над труд­но­стя­ми и обо­жа­е­те слож­но­сти — эта под­бор­ка для вас. В каж­дой зада­че отно­си­тель­но про­стая мате­ма­ти­ка, но убий­ствен­ная логи­ка, кото­рая, как ни стран­но, ока­зы­ва­ет­ся пра­виль­ной. Если вы смо­же­те сами решить их все без наших под­ска­зок — напи­ши­те об этом в ком­мен­та­ри­ях, IT-сфера долж­на знать сво­их героев.

Бабушка и помидоры

Бабуш­ка реши­ла занять­ся фер­мер­ским хозяй­ством — выра­щи­вать и про­да­вать поми­до­ры. Она насо­би­ра­ла 100 кг тома­тов, погру­зи­ла их на тележ­ку и выста­ви­ла с утра перед домом.

Поми­до­ры, кото­рые вырас­ти­ла бабуш­ка, на 99% состо­ят из воды, но на солн­це часть воды испа­ря­ет­ся сквозь кожу­ру. День выдал­ся жар­ким, и к вече­ру воды в поми­до­рах ста­ло уже 98%. Сколь­ко теперь весят бабуш­ки­ны помидоры?

Решение

Резуль­тат может ока­зать­ся неожи­дан­ным для вас, поэто­му вни­ма­тель­но сле­ди­те за расчётами.

Для нача­ла рас­счи­та­ем состав поми­до­ров с утра. В них было 99% воды. Это зна­чит, что в них было 99 кило­грам­мов воды и 1 кило­грамм клет­чат­ки. Эта клет­чат­ка с утра зани­ма­ла 1%:

100% — 99% = 1%.

По усло­вию зада­чи, этот кило­грамм клет­чат­ки не может испа­рить­ся или исчез­нуть, его вес все­гда оди­на­ко­вый. Испа­ря­ет­ся толь­ко вода.

Задача с подвохом: Сложная задача про бабушку и домашние помидоры

Теперь счи­та­ем состав поми­до­ров вече­ром: воды было уже 98%. Это зна­чит, что коли­че­ство воды умень­ши­лось, но вся клет­чат­ка оста­лась на месте: как был кило­грамм с утра, так и остал­ся. Но изме­ни­лось про­цент­ное соот­но­ше­ние клет­чат­ки к воде: сей­час тот же самый кило­грамм клет­чат­ки зани­ма­ет 2% обще­го веса. Давай­те посчи­та­ем, сколь­ко тогда вече­ром весят все помидоры:

2% поми­до­ров весит 1 кило­грамм, а зна­чит 20% весят 10 килограмм.

Умно­жа­ем обе части на 5, что­бы полу­чить пол­ный вес. Получаем:

100% = 50 кг.

Ока­зы­ва­ет­ся, к вече­ру вес сни­зил­ся вдвое! Это неин­ту­и­тив­но, но так рабо­та­ет мате­ма­ти­ка. ¯\_(ツ)_¯

Странный разговор двух программистов

Встре­ча­ют­ся два про­грам­ми­ста, кото­рые дав­но друг дру­га не виде­ли. У них про­ис­хо­дит такой диалог:

— Я слы­шал, у тебя дети появились.

— Да, три сына.

— И сколь­ко им лет?

— Ну... В сум­ме — тринадцать!

— Хм... Ты сно­ва загад­ка­ми гово­ришь? Ну лад­но. Что ещё можешь сказать?

— Если воз­рас­ты пере­мно­жить, полу­чит­ся столь­ко же, сколь­ко окон вон у того дома.

Про­грам­мист счи­та­ет окна и при­ки­ды­ва­ет варианты. 

— Но это­го до сих пор недо­ста­точ­но для ответа!

— Могу доба­вить, что мой стар­ший сын — рыжий.

— Ну теперь совсем дру­гое дело. Им ... (далее сле­ду­ет ответ).

— Пра­виль­но!

Сколь­ко же лет им было? И как пер­вый смог вычис­лить возраст?

Решение

Если вам до сих пор кажет­ся, что эта зада­ча — пол­ная дичь, мы вас пони­ма­ем. И всё-таки у неё есть чёт­кое, логич­ное и точ­ное решение.

Суть его в том, что каж­дый ответ вто­ро­го — уточ­не­ние или под­сказ­ка для реше­ния. И пер­вый зада­вал вопро­сы до тех пор, пока все под­сказ­ки не при­ве­ли его к пра­виль­но­му отве­ту. Давай­те про­сле­дим за ходом его мыслей.

Пер­вый ответ гово­рит нам о том, что все­го детей — трое. Хоро­шо, но явно недо­ста­точ­но для того, что­бы вычис­лить возраст.

Вто­рой ответ гово­рит о том, что в сум­ме детям 13 лет. Давай­те запи­шем все воз­мож­ные ком­би­на­ции воз­рас­тов, кото­рые под­хо­дят под это условие:

1 + 1 + 11 = 13

1 + 2 + 10 = 13

1 + 3 + 9 = 13

1 + 4 + 8 = 13

1 + 5 + 7 = 13

1 + 6 + 6 = 13

2 + 2 + 9 = 13

2 + 3 + 8 = 13

2 + 4 + 7 = 13

2 + 5 + 6 = 13

3 + 3 + 7 = 13

3 + 4 + 6 = 13

3 + 5 + 5 = 13

4 + 4 + 5 = 13

Осталь­ные ком­би­на­ции полу­ча­ют­ся из этих про­стой пере­ста­нов­кой возрастов.

Тре­тий ответ — про­из­ве­де­ние воз­рас­тов рав­но чис­лу окон. Кажет­ся, что это вооб­ще никак нам не помо­га­ет, пото­му что мы не зна­ем коли­че­ства окон в доме, — но это не так. Если бы это­го отве­та было доста­точ­но, то пер­вый бы сра­зу назвал воз­раст, но раз он это­го не сде­лал, зна­чит, инфор­ма­ции было недостаточно.

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

1 × 1 × 11 = 11

1 × 2 × 10 = 20

1 × 3 × 9 = 27

1 × 4 × 8 = 32

1 × 5 × 7 = 35

1 × 6 × 6 = 36

2 × 2 × 9 = 36

2 × 3 × 8 = 48

2 × 4 × 7 = 56

2 × 5 × 6 = 60

3 × 3 × 7 = 63

3 × 4 × 6 = 72

3 × 5 × 5 = 75

4 × 4 × 5 = 80

Раз это­го отве­та про коли­че­ство окон ока­за­лось недо­ста­точ­но, зна­чит в доме было столь­ко окон, что под это чис­ло попа­да­ли сра­зу несколь­ко резуль­та­тов про­из­ве­де­ний. Мы выде­ли­ли их в таб­ли­це. Все осталь­ные чис­ла дава­ли бы одно­знач­ный ответ про воз­раст, а для чис­ла 36 есть несколь­ко вари­ан­тов, поэто­му пер­вый ска­зал, что это­го ему недостаточно.

Чет­вёр­тый ответ — стар­ший сын рыжий. Цвет волос нам не так важен, как коли­че­ство стар­ших сыно­вей. Так как «стар­ший сын» озна­ча­ет, что он такой стар­ший один, зна­чит, вари­ант 1 — 6 — 6 нам не под­хо­дит, пото­му что в нём стар­ших сыно­вей двое. Оста­ёт­ся толь­ко один вари­ант: 2 — 2 — 9.

Ответ: стар­ше­му сыну 9 лет, двум дру­гим — по 2 года.

Странные программисты снова разговаривают

Дво­их про­грам­ми­стов вывез­ли на клад­би­ще бан­ди­ты из девя­но­стых. Бан­ди­ты тай­но выбра­ли 2 целых поло­жи­тель­ных чис­ла, оба боль­ше еди­ни­цы, а их сум­ма мень­ше 100. Пер­во­му про­грам­ми­сту бан­дит ска­зал про­из­ве­де­ние этих чисел, а вто­ро­му — их сум­му. После это­го у про­грам­ми­стов состо­ял­ся такой разговор.

Пер­вый: Я поня­тия не имею, какая у тебя сумма.
Вто­рой: Ха-ха, это для меня не новость! Я и так знал, что ты не знал этого.
Пер­вый: Ага! Теперь я понял, чему рав­на твоя сумма!
Вто­рой: Отлич­но — теперь и я тоже знаю твоё произведение!

Бан­ди­ты, конеч­но же, их отпу­сти­ли. Пото­му что это загад­ка! А загад­ка в том, что это за чис­ла и как про­грам­ми­сты это выяснили.

Решение

В отли­чие от преды­ду­щей зада­чи, здесь реше­ние намно­го слож­нее, пото­му что в голо­ве нуж­но дер­жать одно­вре­мен­но 2-3 усло­вия, кото­ры­ми надо про­ве­рять чис­ла. Но мы справимся.

Для реше­ния нам пона­до­бит­ся вспом­нить, что такое про­стые чис­ла и в чём их осо­бен­ность. Про­стое чис­ло — то, кото­рое может делить­ся наце­ло толь­ко на себя и на еди­ни­цу. Напри­мер, чис­ло 5 — про­стое, пото­му что делит­ся толь­ко на 5 и на 1. А чис­ло 6 — не про­стое, пото­му что кро­ме 6 и 1 оно ещё делит­ся на 2 и 3 без остат­ка. Семь тоже будет про­стым чис­лом, а восемь — нет, пото­му что кро­ме 8 и 1 оно делит­ся так­же на 2 и 4.

Если пере­мно­жить два про­стых чис­ла, то полу­чен­ное про­из­ве­де­ние боль­ше никак нель­зя полу­чить дру­гим спо­со­бом (кро­ме умно­же­ния это­го же чис­ла на еди­ни­цу). Пояс­ним на примере.

Возь­мём два про­стых чис­ла 5 и 7 и пере­мно­жим их — полу­чит­ся 35. Боль­ше чис­ло 35 полу­чить никак не полу­чит­ся, кро­ме как умно­жить 35 на 1. Это зна­чит, что если про­из­ве­де­ние мож­но раз­ло­жить на два про­стых мно­жи­те­ля, то дру­гих вари­ан­тов раз­ло­же­ния (кро­ме чис­ла и еди­ни­цы) у него не будет. Это нам при­го­дит­ся при реше­нии задач — и если чис­ло мож­но раз­ло­жить на 2 про­стых, то и их сум­му тоже лег­ко сра­зу посчитать.

Ещё при­мер:

54 = 2 × 27

54 = 3 × 18

54 = 6 × 9, а это зна­чит, что чис­ло 54 нель­зя полу­чить пере­мно­же­ни­ем двух про­стых чисел и нель­зя сра­зу ска­зать, чему одно­знач­но рав­на сум­ма множителей.

И ещё:

21 = 3 × 7

Оба чис­ла про­стые, поэто­му про­из­ве­де­ние 21 мож­но полу­чить толь­ко из них, а зна­чит, лег­ко посчи­тать сум­му — она будет рав­на 3 + 7 = 10.

Теперь пере­ве­дём их диа­лог на язык мате­ма­ти­ки и логи­ки и обо­зна­чим чис­ла как n и m:

Пер­вый: Я понял, что одно из чисел точ­но не про­стое, пото­му что ина­че я сра­зу бы раз­ло­жил чис­ло на про­из­ве­де­ние двух про­стых и лег­ко полу­чил сум­му. А раз так, то это одно из чисел m или n мож­но полу­чить пере­мно­же­ни­ем двух дру­гих чисел. Поэто­му общее про­из­ве­де­ние состо­ит не менее чем из трёх мно­жи­те­лей, при­чём как мини­мум один из них отли­ча­ет­ся от осталь­ных — поэто­му полу­ча­ет­ся несколь­ко вари­ан­тов воз­мож­ных сумм, и я не знаю, какая из них пра­виль­ная (поме­тим это как Пра­ви­ло 1).

Вто­рой: Сум­му, кото­рая у меня есть, нель­зя полу­чить из двух про­стых чисел, поэто­му и твоё про­из­ве­де­ние тоже нель­зя раз­ло­жить на два про­стых мно­жи­те­ля. Это зна­чит, что у меня нечёт­ная сум­ма, пото­му что, по гипо­те­зе Гольд­ба­ха, в нашем слу­чае мож­но полу­чить любое чёт­ное чис­ло, сло­жив два про­стых. А раз это не два про­стых чис­ла, зна­чит, и сум­ма будет нечёт­ная. А ещё эта сум­ма точ­но не рав­на сум­ме двух и про­сто­го чис­ла, пото­му что два — тоже про­стое, ха! Поэто­му есть несколь­ко вари­ан­тов сум­мы m и n, кото­рые под­хо­дят под твои усло­вия, но я не могу пока опре­де­лить, какие имен­но (поме­тим это как Пра­ви­ло 2).

Пер­вый: Из всех мно­жи­те­лей мое­го про­из­ве­де­ния я могу соста­вить толь­ко один вари­ант пары, сум­ма кото­рой подой­дёт под твоё огра­ни­че­ние — не будет раз­би­вать­ся на сум­му двух про­стых или сум­му чисел одно­го мно­жи­те­ля (Пра­ви­ло 3).

Вто­рой: Ах вот как! Из всех вари­ан­тов пар, на кото­рые мож­но раз­бить сум­му и под­хо­дя­щих под твои усло­вия, есть толь­ко одна, кото­рая поз­во­ли­ла бы тебе опре­де­лить это (Пра­ви­ло 4). Теперь и мне понят­но, что это за числа!

Теперь под­бе­рём вари­ан­ты сум­мы, кото­рая была у вто­ро­го. Огра­ни­че­ния такие:

  • нечёт­ная;
  • не рав­на сум­ме двой­ки и про­сто­го числа.

1 — не под­хо­дит, пото­му что оба чис­ла боль­ше единицы.

2, 4, 6, 8… — нет, пото­му что чётные.

3 — нет, пото­му что это сум­ма двой­ки и про­сто­го числа.

5 — нет, по той же при­чине (2 + 3).

7 — тоже нет (2 + 5).

9 — тоже нет (2 + 7, а 7 — про­стое число).

11 — подходит.

13 — нет, пото­му что 13 = 2 + 11 (11 — про­стое число).

15 — нет, пото­му что 15 = 2 + 13 (13 — тоже про­стое число).

17 — подходит.

19 — нет, пото­му что 19 = 2 + 17 (17 — про­стое число).

Спо­соб под­бо­ра сум­мы поня­тен, даль­ше мож­но про­дол­жать по тому же алго­рит­му. Мы же выбе­рем те, кото­рые нам уже подо­шли, и на их при­ме­ре пока­жем, что нуж­но делать даль­ше, что­бы полу­чить пра­виль­ный ответ. Наши чис­ла, кото­рые нам под­хо­дят уже сей­час: 11 и 17. Нач­нём с 11.

Сум­ма = 11.

Най­дём все сла­га­е­мые, кото­рые могут давать эту сумму:

2 + 9

3 + 8

4 + 7

5 + 6

Для каж­до­го из них запи­шем про­из­ве­де­ние и про­ве­рим, выпол­ня­ет­ся ли Пра­ви­ло 3, кото­рое ска­зал пер­вый программист.

Смот­рим на про­из­ве­де­ние 2 × 9 = 18 и как ещё его мож­но получить.

18 = 2 × 9 → Да (Пра­ви­ло 3 выполняется).

18 = 3 × 6 → Нет (Пра­ви­ло 3 не рабо­та­ет, пото­му что 3 + 6 = 9, а 9 мож­но полу­чить из про­стых чисел 2 и 7).

Смот­рим на про­из­ве­де­ние 3 × 8 = 24.

24 = 2 × 12 → Нет (чёт­ная сум­ма, Пра­ви­ло 2 не работает).

24 = 3 × 8 → Да (выпол­ня­ет­ся Пра­ви­ло 3).

24 = 6 × 4 → Нет (чёт­ная сумма).

Смот­рим на про­из­ве­де­ние 4 × 7 = 28.

28 = 2 × 14 → Нет (чёт­ная сумма).

28 = 4 × 7 → Да (выпол­ня­ет­ся Пра­ви­ло 3).

Смот­рим на про­из­ве­де­ние 5 × 6 = 30.

30 = 2 × 15 → Да.

30 = 3 × 10 → Нет (Пра­ви­ло 3 не рабо­та­ет, пото­му что 3 + 10 = 13, а 13 мож­но полу­чить сум­мой про­стых чисел 2 и 11).

30 = 5 × 6 → Да.

Тут мы вооб­ще не можем выбрать одну пару, пото­му что Пра­ви­ло 3 выпол­ня­ет­ся 2 раза, а зна­чит, этот вари­ант отбрасываем.

Полу­ча­ет­ся, что для сум­мы 11 могут быть три вари­ан­та про­из­ве­де­ний, для кото­рых выпол­ня­ет­ся Пра­ви­ло 3: 2 и 9, 3 и 8, 4 и 7. Но тогда Пра­ви­ло 4 не выпол­ня­ет­ся, пото­му что нуж­но, что­бы для одной сум­мы была толь­ко одна пара, кото­рая под­хо­дит под пра­ви­ло 3. Про­дол­жа­ем искать.

Сум­ма = 17.

Най­дём все сла­га­е­мые, кото­рые могут давать эту сумму:

2 + 15

3 + 14

4 + 13

5 + 12

6 + 11

7 + 10

8 + 9

Для каж­до­го из них запи­шем про­из­ве­де­ние и про­ве­рим, выпол­ня­ет­ся ли Пра­ви­ло 3, кото­рое ска­зал пер­вый программист.

Смот­рим на про­из­ве­де­ние 2 × 15 = 30 и как ещё его мож­но получить.

30 = 2 × 15 → Да.

30 = 3 × 10 → Нет (Пра­ви­ло 3 не рабо­та­ет, пото­му что 3 + 10 = 13, а 13 мож­но полу­чить сум­мой про­стых чисел 2 и 11).

30 = 5 × 6 → Да.

Тут мы вооб­ще не можем выбрать одну пару, пото­му что Пра­ви­ло 3 выпол­ня­ет­ся 2 раза, а зна­чит, этот вари­ант отбрасываем.

Смот­рим на про­из­ве­де­ние 3 × 14 = 42 и как ещё его мож­но получить:

42 = 2 × 21 → Да.

42 = 3 × 14 → Да.

42 = 6 × 7 → Нет.

Два раза выпол­ня­ет­ся Пра­ви­ло 3 — отбра­сы­ва­ем пару.

Смот­рим на про­из­ве­де­ние 4 × 13 = 52 и как ещё его мож­но получить.

52 = 2 × 26 → Нет.

52 = 4 × 13 → Да.

Смот­рим на про­из­ве­де­ние 5 × 12 = 60 и как ещё его мож­но получить.

60 = 2 × 30 → Нет.

60 = 3 × 20 → Да.

60 = 5 × 12 → Да.

60 = 6 × 10 → Нет.

Два раза выпол­ня­ет­ся Пра­ви­ло 3 — отбра­сы­ва­ем пару.

Смот­рим на про­из­ве­де­ние 6 × 11 = 66 и как ещё его мож­но получить.

66 = 2 × 33 → Да.

66 = 3 × 22 → Нет.

66 = 6 × 11 → Да.

Два раза выпол­ня­ет­ся Пра­ви­ло 3 — отбра­сы­ва­ем пару.

Смот­рим на про­из­ве­де­ние 7 × 10 = 70 и как ещё его мож­но получить.

70 = 2 × 35 → Да.

70 = 5 × 14 → Нет.

70 = 7 × 10 → Да.

Два раза выпол­ня­ет­ся Пра­ви­ло 3 — отбра­сы­ва­ем пару.

Смот­рим на про­из­ве­де­ние 8 × 9 = 72 и как ещё его мож­но получить.

72 = 2 × 36 → Нет.

72 = 3 × 24 → Да.

72 = 4 × 18 → Нет.

72 = 6 × 12 → Нет.

72 = 8 × 9 → Да.

Два раза выпол­ня­ет­ся Пра­ви­ло 3 — отбра­сы­ва­ем пару.

Полу­ча­ет­ся, что для сум­мы 17 может быть толь­ко один вари­ант про­из­ве­де­ния, для кото­ро­го выпол­ня­ет­ся Пра­ви­ло 3: это 4 и 13. А зна­чит, что Пра­ви­ло 4 тоже выпол­ня­ет­ся и мы нашли нуж­ные числа!

Если вы дочи­та­ли досю­да и всё поня­ли — сни­ма­ем шля­пу. Вы не из тех, кого могут испу­гать вычис­ле­ния и логи­че­ский подход!

Программисты и странное знакомство

Два джу­на, Арка­дий и Борис, толь­ко что позна­ко­ми­лись с Катей и спра­ши­ва­ют, когда у неё день рож­де­ния. Катя — тех­ни­че­ский дирек­тор и не любит отве­чать пря­мо, поэто­му пред­ло­жи­ла им десять воз­мож­ных дат:

15 мая,
16 мая,
19 мая,
17 июня,
18 июня,
14 июля,
16 июля,
14 авгу­ста,
15 авгу­ста,
17 авгу­ста.

Затем она ска­за­ла Арка­дию месяц сво­е­го рож­де­ния, а Бори­су — день. После это­го состо­ял­ся диалог:

Арка­дий: Я не знаю, когда у Кати день рож­де­ния, но я знаю, что Борис тоже не знает.
Борис: Хе-хе, сна­ча­ла я тоже не знал, когда у неё день рож­де­ния, но теперь знаю.
Арка­дий: А, ну теперь и я знаю.
Борис: Само собой.

Как они сно­ва это сделали?

Оста­вим за скоб­ка­ми, что они мог­ли про­сто сооб­щить друг дру­гу день и месяц.

Решение

Здесь нет ника­кой магии — чистая логи­ка. Раз­бе­рём диа­лог по репликам.

Арка­дий: я не знаю, когда у Кати день рож­де­ния, но я знаю, что Борис тоже не знает

Арка­дий знал толь­ко месяц, но был уве­рен, что Борис про месяц не дога­да­ет­ся — рас­смот­рим это подробнее.

Если бы Катя назва­ла Бори­су 18-е или 19-е чис­ло, Борис бы сра­зу понял, что это 19 мая или 18 июня, пото­му что эти чис­ла встре­ча­ют­ся толь­ко один раз. Но Арка­дий мог гаран­ти­ро­вать, что Борис не зна­ет точ­ной даты, толь­ко в одном слу­чае — если бы день рож­де­ния был в июле или в авгу­сте. Ина­че есть риск, что Бори­су назва­ли 19-е чис­ло из мая или 18-е из июня.

Полу­ча­ет­ся, что это не может быть май или июнь, ина­че нет сто­про­цент­ной гаран­тии, что Бори­су не назо­вут 18-е или 19-е чис­ло. Оста­ют­ся июль и август.

Борис: хе-хе, сна­ча­ла я тоже не знал, когда у неё день рож­де­ния, но теперь знаю

На этом момен­те у нас оста­лись такие даты: 14 июля, 14 авгу­ста, 16 июля, 15 авгу­ста, 17 авгу­ста. Борис понял, что Арка­дий исклю­чил май и июнь, и это дало ему нуж­ную под­сказ­ку по меся­цу. Полу­ча­ет­ся, что это было точ­но не 14 чис­ло, пото­му что оно встре­ча­ет­ся по одно­му разу в каж­дом остав­шем­ся меся­це, и ответ Арка­дия ниче­го бы Бори­су не дал.

Оста­ют­ся 16 июля, 15 авгу­ста и 17 авгу­ста. Имен­но сре­ди них и есть день рож­де­ния Кати, месяц кото­ро­го Борис одно­знач­но опре­де­лил по чис­лу. Мы с вами пока его ещё не зна­ем, но Борис в этот момент его уже вычислил.

Арка­дий: А, ну теперь и я знаю

После отве­та Бори­са Арка­дий понял, что Борис оста­вил себе эти три даты и по чис­лу дога­дал­ся о меся­це. Нам же вме­сте с Арка­ди­ем нуж­но сде­лать наобо­рот — по меся­цу дога­дать­ся о числе.

16 июля, 15 авгу­ста, 17 августа.

По усло­вию, Арка­дий зна­ет месяц, и раз он после отве­та Бори­са дога­дал­ся о точ­ной дате, то это был июль. Дело в том, что если бы Арка­дию назва­ли август, то он бы не смог одно­знач­но выбрать, 15 или 17 авгу­ста отме­ча­ет­ся день рож­де­ния. А раз так, то оста­ёт­ся июль, а един­ствен­ное остав­ше­е­ся чис­ло в июле — 16-е.

Полу­ча­ет­ся, что день рож­де­ния Кати — 16 июля, а Борис и Арка­дий сно­ва полу­ча­ют приз за самые стран­ные диалоги.

Но пошла ли она с кем-то из них на свидание? 

Самая сложная задача в мире

Име­ют­ся три раз­ра­бот­чи­ка: бэкенд (А), фрон­тенд (В) и фул­стек (С). Пер­вый все­гда гово­рит прав­ду, вто­рой все­гда лжёт, а тре­тий все­гда отве­ча­ет слу­чай­ным обра­зом, то есть может как соврать, так и ска­зать прав­ду. Нуж­но за три вопро­са выяс­нить, кто из них кто.

Огра­ни­че­ния и условия:

  • Про­грам­ми­сты отве­ча­ют толь­ко фра­за­ми «Надо поду­мать» и «Зави­сит от ситу­а­ции». Одна из этих фраз озна­ча­ет «Да», дру­гая — «Нет», но мы зара­нее не зна­ем, какая где.
  • Один и тот же вопрос двум раз­ра­бот­чи­кам зада­вать нель­зя (но задать два вопро­са одно­му раз­ра­бот­чи­ку — можно).
  • Не обя­за­тель­но зада­вать вопро­сы каж­до­му раз­ра­бот­чи­ку, мож­но все три вопро­са задать одному.
  • Вы сами реша­е­те, кому и в каком поряд­ке зада­вать вопросы.
  • Нель­зя зада­вать фило­соф­ские вопро­сы, на кото­рые нель­зя отве­тить одно­знач­но «Да» или «Нет».
  • Нель­зя зада­вать такие вопро­сы, на кото­рые невоз­мож­но ответить.
Решение

Наша зада­ча — одно­знач­но опре­де­лить бэкен­да и фрон­тен­да, что­бы мето­дом исклю­че­ния най­ти фулстека.

Слож­ность зада­чи в том, что мы не зна­ем, что озна­ча­ют их отве­ты. Если мы что-то спро­сим и нам отве­тят «Надо поду­мать», то как мы пой­мём, это «Да» или «Нет»? Полу­ча­ет­ся, что нам нуж­но зада­вать такие вопро­сы, что­бы уже с пер­во­го отве­та понять, что на самом деле озна­ча­ет их «Зави­сит от ситу­а­ции» или «Надо подумать».

Но тра­тить один вопрос из трёх толь­ко что­бы выяс­нить это — глу­по. Надо ещё полу­чить какую-то инфор­ма­цию о том, кто перед нами (или кого перед нами точ­но нет). Зна­чит, пер­вый вопрос дол­жен состо­ять из двух частей: дать нам новую инфор­ма­цию о раз­ра­бот­чи­ке и одно­вре­мен­но с этим уста­но­вить, что у них озна­ча­ет «Зави­сит от ситу­а­ции» и «Надо подумать».

Напри­мер, сфор­му­ли­ру­ем вопрос так: «Если я спро­шу у тебя „Про­грам­мист В — это фул­стек?“, ты отве­тишь мне „Зави­сит от ситуации“?»

Общая схе­ма состав­ле­ния подоб­ных вопро­сов такая: мы фор­му­ли­ру­ем какой-то вопрос про дру­го­го про­грам­ми­ста и спра­ши­ва­ем, если бы ответ был вер­ным, ты бы отве­тил вот так-то? Такие вопро­сы помо­гут понять, что за про­грам­мист сто­ит перед нами, и, что самое важ­ное, даст нам допол­ни­тель­ную инфор­ма­цию про вто­ро­го программиста.

Что­бы понять, как рабо­та­ют такие вопро­сы и поче­му их нуж­но исполь­зо­вать, давай­те раз­бе­рём, как на них отве­ча­ют бэкенд и фрон­тенд. Фул­с­те­ка пока раз­би­рать смыс­ла нет: он отве­ча­ет абсо­лют­но ран­дом­но, и как трак­то­вать его отве­ты, рас­ска­жем позже.

Напри­мер, вот вопрос: «Если я спро­шу у тебя „Раз­ра­бот­чик В — это фул­стек?“, ты отве­тишь мне „Зави­сит от ситуации“?»

Если пра­виль­ный ответ на задан­ный нами вопрос — «Да», то нам отве­тят «Зави­сит от ситу­а­ции», а если пра­виль­ный ответ — «Нет», то нам отве­тят «Надо подумать».

Доказательство

Автор зада­чи пони­мал, что это утвер­жде­ние нуж­но чем-то дока­зать, поэто­му он сра­зу после тек­ста зада­чи при­вёл дока­за­тель­ства сво­ей право­ты. Сле­ди­те вни­ма­тель­но за логи­кой ответов.

1. Допу­стим, что «Зави­сит от ситу­а­ции» озна­ча­ет «Да», а «Надо поду­мать» озна­ча­ет «Нет»:

  • Мы спра­ши­ва­ли у бэкен­да, и он отве­тил «Зави­сит от ситу­а­ции». Посколь­ку он все­гда гово­рит прав­ду и вер­ный ответ на наш вопрос — «Зави­сит от ситу­а­ции», он озна­ча­ет «Да».
  • Мы спра­ши­ва­ли у бэкен­да, и он отве­тил «Надо поду­мать». Посколь­ку он все­гда гово­рит прав­ду и вер­ный ответ на наш вопрос — «Надо поду­мать», то он озна­ча­ет «Нет».
  • Мы спра­ши­ва­ли у фрон­тен­да, и он отве­тил «Зави­сит от ситу­а­ции». Посколь­ку он все­гда лжёт, то на наш вопрос он отве­тит «Надо поду­мать». Полу­ча­ет­ся, что пра­виль­ный ответ на вопрос — «Зави­сит от ситу­а­ции», кото­рый озна­ча­ет «Да».
  • Мы спра­ши­ва­ли у фрон­тен­да, и он отве­тил «Надо поду­мать». Так как он все­гда лжёт, то на наш вопрос он отве­тит «Зави­сит от ситу­а­ции». Полу­ча­ет­ся, пра­виль­ный ответ на вопрос — «Надо поду­мать», кото­рый озна­ча­ет «Нет».

2. Пред­ста­вим обрат­ное: «Зави­сит от ситу­а­ции» озна­ча­ет «Нет», а «Надо поду­мать» озна­ча­ет «Да»:

  • Мы спра­ши­ва­ли у бэкен­да, и он отве­тил «Зави­сит от ситу­а­ции». Посколь­ку он все­гда гово­рит прав­ду и вер­ный ответ на наш вопрос — «Надо поду­мать», то его ответ озна­ча­ет «Да».
  • Мы спра­ши­ва­ли у бэкен­да, и он отве­тил «Надо поду­мать». Посколь­ку он все­гда гово­рит прав­ду и вер­ный ответ на наш вопрос будет «Зави­сит от ситу­а­ции», то его ответ озна­ча­ет «Нет».
  • Мы спра­ши­ва­ли у фрон­тен­да, и он отве­тил «Зави­сит от ситу­а­ции». Так как он все­гда лжёт, полу­ча­ет­ся, что вер­ный ответ на наш вопрос — «Надо поду­мать», и его ответ озна­ча­ет «Да».
  • Мы спра­ши­ва­ли у фрон­тен­да, и он отве­тил «Надо поду­мать». Посколь­ку он все­гда лжёт, то вер­ный ответ на наш вопрос — «Зави­сит от ситу­а­ции», и полу­ча­ет­ся, что его ответ озна­ча­ет «Нет».

Это безум­но слож­ное на пер­вый взгляд дока­за­тель­ство мате­ма­ти­че­ски вер­ное. Мы к нему ещё вер­нём­ся, когда будем рас­ска­зы­вать про мате­ма­ти­че­скую логи­ку и про то, как она рабо­та­ет в жизни.

Если вы три раза про­чи­та­ли это, но так ниче­го и не поня­ли — это нор­маль­но, тогда про­сто поверь­те, что дока­за­тель­ство верное 🙂

Конец доказательства

Теперь мы можем это исполь­зо­вать для того, что­бы выяс­нить, кто из них кто.

1. Сна­ча­ла зада­дим вто­ро­му раз­ра­бот­чи­ку вопрос: «Если я спро­шу у тебя „Пер­вый раз­ра­бот­чик — это фул­стек?“, ты отве­тишь мне „Зави­сит от ситуации“?»

Если вто­рой раз­ра­бот­чик отве­ча­ет «Зави­сит от ситу­а­ции», зна­чит, либо он фул­стек и отве­ча­ет абсо­лют­но ран­дом­но, либо он не фул­стек, а на самом деле пер­вый раз­ра­бот­чик — фул­стек. В любом вари­ан­те, тре­тий остав­ший­ся раз­ра­бот­чик — это не фулстек.

Если же вто­рой отве­ча­ет «Надо поду­мать», то либо он фул­стек и отве­ча­ет слу­чай­ным обра­зом, либо он не фул­стек, а это озна­ча­ет, что пер­вый раз­ра­бот­чик — тоже не фул­стек. В любом вари­ан­те, пер­вый раз­ра­бот­чик — это не фулстек.

2. По пер­во­му вопро­су нам ста­ло понят­но, кто из них НЕ фул­стек. Спро­сим у него: «Если я спро­шу у тебя: „Ты — фрон­тенд?“, ты отве­тишь мне „Зави­сит от ситу­а­ции“?» Посколь­ку он не фул­стек, ответ «Надо поду­мать» озна­ча­ет, что он бэкенд, а ответ «Зави­сит от ситу­а­ции» озна­ча­ет, что он фронтенд.

3. Спро­сим у это­го же раз­ра­бот­чи­ка «Если я у тебя спро­шу: „Про­грам­мист, кото­ро­му я зада­вал свой пер­вый вопрос — фул­стек?“, отве­тишь ли ты „Зави­сит от ситу­а­ции“?» Если отве­тят «Зави­сит от ситу­а­ции» — то пер­вый, у кого мы спра­ши­ва­ли, будет фул­сте­ком, а если нам отве­тят «Надо поду­мать», то фул­сте­ком будет про­грам­мист, с кото­рым ещё не говорили.

Послед­ний раз­ра­бот­чик опре­де­ля­ет­ся мето­дом исключения.

Монти Холл и три шкатулки

Перед вами сто­ят три оди­на­ко­вых закры­тых шка­тул­ки, в одной из них лежит мно­го денег, а две дру­гих — пустые. Мож­но выбрать любую шка­тул­ку, но сра­зу откры­вать нель­зя. Затем веду­щий игры берёт одну из остав­ших­ся шка­ту­лок, откры­ва­ет и пока­зы­ва­ет, что она пустая.

Теперь у вас есть выбор: оста­вить себе ту шка­тул­ку, кото­рую вы выбра­ли с само­го нача­ла, или поме­нять её на остав­шу­ю­ся неот­кры­тую. Как луч­ше поступить?

Решение

Отбро­сим в сто­ро­ну эмо­ции, инту­и­цию и про­чую эзо­те­ри­ку и нач­нём решать эту зада­чу как про­грам­ми­сты — дадим нашим шка­тул­кам имена:

  • Выбран­ная — шка­тул­ка, кото­рую мы выбра­ли с само­го начала;
  • Пустая — ту, кото­рую откры­ли после наше­го выбо­ра и пока­за­ли, что она пустая;
  • Неиз­вест­ная — одна из двух невы­бран­ных нами шка­ту­лок, кото­рая оста­лась закры­той, и на кото­рую мож­но поме­нять нашу.

Изна­чаль­но веро­ят­ность того, что вы выбра­ли сра­зу шка­тул­ку с день­га­ми — 33%, пото­му что в самом нача­ле у каж­дой шка­тул­ки оди­на­ко­вые шан­сы. Но теперь всё зави­сит от того, слу­чай­но ли веду­щий открыл Пустую шка­тул­ку, или знал зара­нее, что в ней ниче­го нет. Имен­но от это­го будет зави­сеть, как нуж­но поступить.

Если пустую шкатулку открыли случайно

Допу­стим, веду­щий игры не знал ниче­го о содер­жа­нии шка­тул­ки. То есть, откры­вая одну из невы­бран­ных, он мог открыть и шка­тул­ку с деньгами.

Раз это­го не про­изо­шло и никто дей­стви­тель­но зара­нее не знал, в какой из шка­ту­лок день­ги, то у них теперь рав­ные шан­сы на побе­ду: вме­сто ⅓ они ста­ли рав­ны ½. У обе­их шка­ту­лок теперь оди­на­ко­вая веро­ят­ность ока­зать­ся с день­га­ми, поэто­му менять шка­тул­ки смыс­ла нет: мате­ма­ти­че­ски это никак не уве­ли­чит ваши шан­сы. Всё, что будет даль­ше, уже эзотерика.

Ито­го. Если Пустую шка­тул­ку откры­ли слу­чай­но и никто не знал зара­нее, что она пустая, то вер­ная стра­те­гия будет такой: оста­вить себе Выбран­ную шкатулку.

Пустую шкатулку выбрали специально

Теперь рас­смот­рим ситу­а­цию: веду­щий знал, что откры­тая шка­тул­ка ока­жет­ся пустой. Он изна­чаль­но знал, где лежат день­ги, и спе­ци­аль­но выбрал пустую шка­тул­ку, что­бы её открыть.
Это совсем дру­гая ситу­а­ция, хотя может пока­зать­ся, что она такая же, как и в пер­вом слу­чае. На самом деле нет. Там у нас появ­ля­лась новая инфор­ма­ция, пото­му что никто не знал, где лежат день­ги. Новая инфор­ма­ция заста­ви­ла пере­счи­тать шансы.

В этом слу­чае новой инфор­ма­ции нет, пото­му что шка­тул­ка с день­га­ми извест­на зара­нее. А раз новой инфор­ма­ции нет, то у Выбран­ной шка­тул­ки, шан­сы на побе­ду как были ⅓, так и оста­лись. А теперь начи­на­ет­ся магия тео­рии веро­ят­но­сти: шан­сы на побе­ду у Неиз­вест­ной шка­тул­ки вырос­ли вдвое!

Дело тут вот в чём. Раз изна­чаль­но у всех шка­ту­лок шан­сы были рав­ны, то для каж­дой шка­тул­ки они состав­ля­ли ⅓. Когда нам умыш­лен­но откры­ли Пустую шка­тул­ку, то веро­ят­ность Выбран­ной шка­тул­ки не поме­ня­лась (так как новой инфор­ма­ции нет), а веро­ят­ность Неиз­вест­ной шка­тул­ки вырос­ла вдвое:

⅓, кото­рая была изна­чаль­но + ⅓, кото­рая пере­шла от Пустой шка­тул­ки к Неиз­вест­ной = ⅔.

Нет новой инфор­ма­ции — шан­сы не пере­счи­ты­ва­ют­ся, а пере­рас­пре­де­ля­ют­ся меж­ду теми шка­тул­ка­ми, содер­жи­мое кото­рых зара­нее извест­но. Раз откры­ва­ю­щий шка­тул­ки зна­ет, где день­ги, зна­чит, шан­сы пере­рас­пре­де­ля­ют­ся меж­ду ними. А у вашей шка­тул­ки как был шанс на побе­ду ⅓, так и остался.

Ито­го. Если Пустую шка­тул­ку откры­ли спе­ци­аль­но, пра­виль­ная стра­те­гия будет такой: поме­нять Выбран­ную шка­тул­ку на Неиз­вест­ную. Это повы­сит ваши шан­сы на побе­ду в 2 раза. 

Важ­но пони­мать, что мы гово­рим о шан­сах и веро­ят­но­стях, а не о кон­крет­ном еди­нич­ном слу­чае. Ина­че гово­ря, эта стра­те­гия будет иметь смысл, если сыг­рать мно­го игр с оди­на­ко­вы­ми усло­ви­я­ми: сто, три­ста, тыся­чу. На одной кон­крет­ной игре эффект веро­ят­но­стей не будет заме­тен. Поэто­му вме­сто азарт­ных игр мы реко­мен­ду­ем ком­мер­че­ское программирование.