Ультрасложная задача про пьяных программистов и коллизию
hard

Ультрасложная задача про пьяных программистов и коллизию

Случай в бильярдной

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

Все знали, что сеньор лучше всех пьёт и играет, поэтому мидл предложил считать так: 

«Если сеньор забьёт меньше шаров, чем другие участники, вместе взятые, — он проиграл и платит за всех»

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

Когда партия закончилась, получились такие результаты:

Джуниор забил 2 шара

Мидл — 4 шара

Сеньор — 6 шаров

Тимлид — 4 шара

Кто должен оплатить счёт?

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

У нас коллизия выглядит так: 

  • Если не брать в расчёт тимлида, то сеньор победил, следовательно, оплатить счёт должен либо джун, либо мидл. Тимлид вообще как бы не при делах.
  • Если считать с тимлидом, то сеньор проиграл и оплачивает счёт он.

Вторая проблема — неясен алгоритм определения проигравшего, если проиграл не сеньор. Допустим, сеньор победил — как тогда рассчитывается, кто оплачивает счёт? Там же тоже есть варианты: 

  • Оплачивает тот, кто забил меньше всего шаров (то есть джун).
  • Оплачивает тот, кто забил больше всего шаров среди тех, кто не победил.
  • Счёт делится между теми, кто не победил, но кто участвовал в игре на момент её старта (то есть среди двоих).
  • То же самое, но среди участников на конец игры (то есть среди троих).

Наконец, неясно, как будет оплачен счёт, если два человека будут иметь одинаковый результат (например, если и джун, и мидл закатили бы по 2 шара). Счёт нужно разделить? Оплатить должен тот, кто первым набрал 2 шара? Или кто последним? Или по алфавиту? Или по очерёдности вступления в игру? 

Вот эти все дырки в алгоритме привели к коллизии. А так как алгоритм сочинил мидл, то теперь это его проблема. 

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

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Любите математику? Это для вас
Попробуйте бесплатный тренажер «Основы математики для цифровых профессий». Это все необходимые знания, чтобы закрыть пробелы в математике для айтишника.
Попробовать бесплатно
Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
hard