Предновогодняя задачка: Дед Мороз против Санта-Клауса
easy

Предновогодняя задачка: Дед Мороз против Санта-Клауса

Как думаете, кто победит?

Так вышло, что накануне Нового года встретились Санта-Клаус и Дед Мороз и решили выяснить, кто из них круче. Для этого они сыграли в игру «камень-ножницы-бумага».

Санта-Клаус выбросил «камень» дважды, «ножницы» четырежды и «бумагу» четырежды. Дед Мороз выбросил «камень» трижды, «ножницы» шесть раз и «бумагу» один раз. Ни одной ничьей не было.

Кто из них победил и с каким счётом?

Поначалу кажется, что задачка сложная, но давайте разберём её на составляющие. Вспомним, кто какие знаки выбросил.

Санта-Клаус:

  • «камень» 🤜 — 2,
  • «ножницы» ✌️ — 4,
  • «бумага» 🫱 — 4.

Дед Мороз:

  • «камень» 🤜 — 3,
  • «ножницы» ✌️ — 6,
  • «бумага» 🫱 — 1.

Поскольку по условию ничьих не было, получается, что Дед Мороз выбросил «ножницы» 6 раз не в те раунды, когда их выбросил Санта-Клаус. Тогда выходит, что эти шесть раундов были сыграны так:

  • Дед Мороз ✌️ — 🤛 Санта-Клаус (победил Санта-Клаус);
  • Дед Мороз ✌️ — 🤛 Санта-Клаус (победил Санта-Клаус);
  • Дед Мороз ✌️ — 🫲 Санта-Клаус (победил Дед Мороз);
  • Дед Мороз ✌️ — 🫲 Санта-Клаус (победил Дед Мороз);
  • Дед Мороз ✌️ — 🫲 Санта-Клаус (победил Дед Мороз);
  • Дед Мороз ✌️ — 🫲 Санта-Клаус (победил Дед Мороз).

Теперь посмотрим, какие броски остались: Санта-Клаус четырежды выбросил «ножницы». Тогда исход раундов получается такой:

  • Дед Мороз 🤜 — ✌️ Санта-Клаус (победил Дед Мороз);
  • Дед Мороз 🤜 — ✌️ Санта-Клаус (победил Дед Мороз);
  • Дед Мороз 🤜 — ✌️ Санта-Клаус (победил Дед Мороз);
  • Дед Мороз 🫱 — ✌️ Санта-Клаус (победил Санта-Клаус).

Посчитаем количество побед каждого:

  • Дед Мороз — 7,
  • Санта-Клаус — 3.

Получается, что выиграл Дед Мороз, и он круче Санта-Клауса! Но мы и не сомневались :-)

Призовём силу машин и победим эту задачу простым перебором. Логика будет такая:

  1. Создаём списки знаков каждого и перемешиваем их.
  2. Берём первый список Деда Мороза из числа перемешанных и сравниваем его поэлементно с первым списком Санта-Клауса из числа перемешанных.
  3. Если есть одинаковые элементы на одних и тех же позициях — переходим к следующему списку.
  4. Если одинаковых элементов не было, считаем результат игры. Если таких результатов в списке нет — добавляем их в список. Идея в том, чтобы не добавлять туда одинаковые результаты, а только те, что различаются.
  5. В конце выведем все найденные результаты.

Запишем всё это на языке Python:

import itertools

dm = ['к', 'к', 'к', 'н', 'н', 'н', 'н', 'н', 'н', 'б' ]
sc = ['к', 'к', 'н', 'н', 'н', 'н', 'б', 'б', 'б', 'б' ]

print('Перемешиваем комбинации Деда Мороза')
dm_all = list(itertools.permutations(dm))

print('Перемешиваем комбинации Санта-Клауса')
sc_all = list(itertools.permutations(sc))

dm_win = 0
sc_win = 0

dm_win_list = []
sc_win_list = []

print('Пожалуйста, подождите немного, перебираем все варианты')
for i in range(len(dm_all)):
    for j in range(len(sc_all)):
        dm_win = 0
        sc_win = 0
        # если есть одинаковые элементы на одних позициях — идём к следующей комбинации
        if dm_all[i][0] == sc_all[j][0] or dm_all[i][1] == sc_all[j][1] or dm_all[i][2] == sc_all[j][2] or dm_all[i][3] == sc_all[j][3] or dm_all[i][4] == sc_all[j][4] or dm_all[i][5] == sc_all[j][5] or dm_all[i][6] == sc_all[j][6] or dm_all[i][7] == sc_all[j][7] or dm_all[i][8] == sc_all[j][8] or dm_all[i][9] == sc_all[j][9]:
            break
        for curr in range(10):
            if dm_all[i][curr] == 'к' and sc_all[j][curr] == 'б':
                sc_win += 1
            if dm_all[i][curr] == 'к' and sc_all[j][curr] == 'н':
                dm_win += 1
            if dm_all[i][curr] == 'н' and sc_all[j][curr] == 'б':
                dm_win += 1
            if dm_all[i][curr] == 'н' and sc_all[j][curr] == 'к':
                sc_win += 1
            if dm_all[i][curr] == 'б' and sc_all[j][curr] == 'к':
                dm_win += 1
            if dm_all[i][curr] == 'б' and sc_all[j][curr] == 'н':
                sc_win += 1
            if dm_all[i][curr] == sc_all[j][curr]:
                dm_win = 0
                sc_win = 0
                break
        # если кто-то победил — заносим в список
        if dm_win != 0 or sc_win != 0:
            if dm_win not in dm_win_list and sc_win not in sc_win_list:
                dm_win_list.append(dm_win)
                sc_win_list.append(sc_win)

for i in range(len(dm_win_list)):
    print('Результат: Дед Мороз: ' + str(dm_win_list[i]) + ' Санта-Клаус: ' + str(sc_win_list[i]))

Обложка:

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

Корректор:

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

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

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