Задача о спрятанном решении
Головоломка в рамках нашего нового формата и ответ на предыдущую задачу. Догадаетесь, что школьник спрятал за звёздочками?
Эта задача является вторым эпизодом нашего сериала головоломок. После описания задачи представлен ответ на вчерашнюю задачу о двойных фамилиях.
Задача о спрятанном решении
Школьник перемножил два числа в столбик, а потом закрасил звездочками все цифры кроме одной девятки. Получилось как на картинке выше. Какие цифры стояли на месте звёздочек?
Ответ и решение – в следующей задаче.
А сейчас? Пока что нужно попытаться самим. Идеи и решения можно обсудить в комментариях.
Решение задачи о двойных фамилиях
Математическое решение. Обозначим буквами: A, B, C, D
«простые» фамилии внутри составных. Эти фамилии уже могут являться их общей фамилией.
Остальные фамилии – размещения из четырех по двум. Число размещений равно
4! / (4−2)! = 4! / 2! = 4 ⋅ 3 = 12
.
Действительно, эти 12 вариантов можно и перебрать:
AB AC AD
BA BC BD
CA CB CD
DA DB DC
Таким образом, суммарное число фамилий равно шестнадцати.
Ответ: 16.
Программное решение 🌟🐍. Решим ещё и программно – на Python. Мы как раз недавно рассматривали применение библиотеки itertools. Попрактикуемся в применении:
from itertools import chain, permutations def find_all_surnames(surnames): # разбиваем составные фамилии по дефису surnames = [surname.split('-') for surname in surnames] # преобразуем в плоский список, получаем список "обычных" фамилий surnames = list(chain.from_iterable(surnames)) # остальные варианты соответствуют перестановкам обычных фамилий perm_surnames = list(permutations(surnames, 2)) # объединяем составные фамилии через дефис perm_surnames = ['{}-{}'.format(i, j) for (i, j) in perm_surnames] # соединяем два списка surnames.extend(perm_surnames) return surnames # проверим работу функции на практике surnames = find_all_surnames(['Склодовская-Кюри', 'Миклухо-Маклай']) print('Общее число фамилий равно {}. Вот их список без учёта пола:'.format(len(surnames))) for surname in surnames: print('- '+surname)
Код выше выведет следующее:
Общее число фамилий равно 16. Вот их список без учёта пола: - Склодовская - Кюри - Миклухо - Маклай - Склодовская-Кюри - Склодовская-Миклухо - Склодовская-Маклай - Кюри-Склодовская - Кюри-Миклухо - Кюри-Маклай - Миклухо-Склодовская - Миклухо-Кюри - Миклухо-Маклай - Маклай-Склодовская - Маклай-Кюри - Маклай-Миклухо
Если вам понравилось решать задачу. Это решение использует две эффективные функции встроенной библиотеки itertools
. Чтобы попрактиковаться в алгоритмах, решите ту же задачу, не задействовав библиотек. Сравните время выполнения кода.