Три программиста и отпуск
2026-02-21 04:06 Diff

#статьи

  • 21 сен 2021
  • 0

Три программиста и отпуск

Запутанная задача на логику. Распутываем вместе с репетитором.

Альберто Блинчиков для Skillbox Media

Автор статей о программировании. Изучает Python, разбирает сложные термины и объясняет их на пальцах новичкам. Если что-то непонятно — возможно, вы ещё не прочли его следующую публикацию.

Преподаватель математики, автор YouTube-канала «Математика с Аней» и соавтор учебников и методических рекомендаций к учебникам по математике.

Анна готовит учеников к ЕГЭ в школе «Топскул» и консультирует онлайн-школы по вопросам эффективного обучения.

Три друга-программиста решили отправиться в отпуск и теперь выбирают, куда им ехать. У них есть четыре варианта: Рим, Брюссель, Осло и Норильск. Однако они не смогли договориться и решили провести голосование. Правила такие:

  1. Сначала голосуют за поездку в Рим. Если хотя бы двое будут ЗА — голосование прекращается и все отправляются в Рим.
  2. Если большинство не поддержит идею с Римом — голосуют по поездке в Брюссель.
  3. Если и с Брюсселем не сложится — голосуют по поводу Осло.
  4. Если и с Осло не получится — все отправятся загорать в Норильск.

Каждый программист действует безупречно логично: знает свои приоритеты и приоритеты других участников. Например, первый программист больше всего хочет попасть в Осло. Но если коллеги его не поддержат, он выберет Норильск. Если и с Норильском не сложится, остаётся Рим. Ну и на крайний случай — Брюссель. Приоритеты всех участников — в таблице:

Вопрос: какой город выберут программисты и будет ли это лучшим решением для большинства?

В условии задачи есть фраза: «Каждый программист действует безупречно логично». А значит, все герои голосуют по безупречно логичным правилам — последовательно, непротиворечиво, не подчиняясь принципам человеческой психологии и общепринятым правилам поведения:

Безупречно логичное поведение Суровая жизненная реальность Если в задаче сказано, что программист 20 лет не опаздывает, не ходит в отпуск и не требует повышения, то так и есть. В жизни почти все программисты хоть иногда опаздывают, регулярно ходят в отпуск и стремятся к карьерному росту. Если нужно проголосовать по строгим правилам, то каждый участник будет следовать этим правилам от начала и до конца. Кто-то из участников может смухлевать, кто-то поймёт правила по-своему и нарушит их, а кто-то вообще может проигнорировать правила и само голосование. Безупречно логичные персонажи думают о личной выгоде, никому не помогают и ни с кем не договариваются. Несколько программистов с общим интересом могут договориться и увеличить свои шансы на получение желаемого результата. Все действуют в личных интересах и всегда знают приоритеты других персонажей. Следовательно, все принимают решения, отталкиваясь от предположительных действий других участников. Всегда сложно узнать, как и о чём думают другие люди.

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

Ещё обратите внимание на формулировку вопроса. Она предполагает два ответа: 1) куда поедут программисты и 2) будет ли это лучшим решением для большинства. Первый вопрос проверяет навык логического мышления; второй — внимательность.

Шаг №1. Программисты будут делать выбор между четырьмя городами, но проводят три этапа голосования — поедут они в Норильск или нет, зависит от голосования за Осло. То есть на третьем этапе они будут выбирать между Осло и Норильском — потому что варианта поехать в Рим или Брюссель к тому времени не останется.

Смотрим таблицу приоритетов участников и понимаем, что на третьем этапе первый и второй программисты проголосуют ЗА Осло, а третий — ПРОТИВ. Вывод: если голосование дойдёт до третьего этапа, то программисты отправятся в Осло, а не в Норильск. Уже неплохо :)

Шаг №2. Теперь предположим, что голосование не дойдёт до третьего этапа. В этом случае программисты будут выбирать между поездкой в Брюссель и Осло, так как мы уже увидели — на третьем этапе они точно не выберут Норильск. А значит, первый программист проголосует ПРОТИВ поездки в Брюссель, а второй и третий — ЗА. Победит Брюссель.

Шаг №3. Поднимемся на следующую ступеньку и узнаем, что будет с голосованием за Рим. Здесь участники делают выбор между Римом и Брюсселем. Почему так? Да потому, что они уже понимают: на втором этапе голосования точно победит Брюссель.

Первый и третий программист проголосуют ЗА поездку в Рим, а второй — ПРОТИВ. То есть вариант с отпуском в Риме будет принят после первого голосования. Отлично!

Итог: программисты поедут в Рим.

Теперь разберёмся со второй частью вопроса. Если голосование пройдёт без учёта безупречно логичных правил, то на исход повлияет договорённость между участниками. Рассмотрим два возможных сценария.

Первый сценарий. Первый и второй программист объединятся и выберут Осло — в их общей системе приоритетов этот город стоит выше, чем Рим.

По-другому двум программистам объединяться невыгодно:

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

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

Второй сценарий. Первый и второй участник не могут объединиться и должны искать компромисс с третьим программистом. В этом случае оптимальным решением будет Норильск, поскольку по сумме всех приоритетов он окажется выше Осло, Брюсселя и Рима.

Добавим к графику расчёты:

  • У первого программиста Норильск стоит на втором месте; у второго — на третьем; у третьего — на первом. В сумме Норильск наберёт 6 баллов.
  • Осло — 7 баллов.
  • Брюссель — 8 баллов.
  • Рим — 9 баллов.

Итог: чем меньше баллов, тем выше приоритет. Следовательно, если программисты попытаются договориться и математически учесть все приоритеты, лучшим решением для большинства будет Норильск.


Бесплатный курс по Python ➞
Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу