12 января 2020

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

Пишу, перевожу и иллюстрирую IT-статьи. На proglib написал 140 материалов. Увлекаюсь Python, вебом и Data Science. Открыт к диалогу – ссылки на соцсети и мессенджеры: https://matyushkin.github.io/links/ Если понравился стиль изложения, упорядоченный список публикаций — https://github.com/matyushkin/lessons
Головоломка в рамках нашего нового формата и ответ на предыдущую задачу. Догадаетесь, что школьник спрятал за звёздочками?
Задача о спрятанном решении

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

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

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

Ответ и решение – в следующей задаче.

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

***

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

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

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ