Задача о спрятанном решении

Задача о спрятанном решении

Головоломка в рамках нашего нового формата и ответ на предыдущую задачу. Догадаетесь, что школьник спрятал за звёздочками?

Эта задача является вторым эпизодом нашего сериала головоломок. После описания задачи представлен ответ на вчерашнюю задачу о двойных фамилиях.

Задача о спрятанном решении

Школьник перемножил два числа в столбик, а потом закрасил звездочками все цифры кроме одной девятки. Получилось как на картинке выше. Какие цифры стояли на месте звёздочек?

Ответ и решение – завтра в 14:00.

А сейчас? Пока что нужно попытаться самим. Идеи и решения можно обсудить в комментариях.

***

Решение задачи о двойных фамилиях

Математическое решение. Обозначим буквами: 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. Чтобы попрактиковаться в алгоритмах, решите ту же задачу, не задействовав библиотек. Сравните время выполнения кода.

proglib.io

Добавить комментарий

Ваш e-mail не будет опубликован.

14 − тринадцать =