12 января 2020

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

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

Хочешь уверенно проходить IT-интервью?

Готовься к IT-собеседованиям уверенно с AI-тренажёром T1!

Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.

💡 Почему Т1 тренажёр — это мастхэв?

  • Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше
  • Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
  • Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.

Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!

Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy


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

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

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

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

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

***

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

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

Комментарии

ВАКАНСИИ

Добавить вакансию
Hotel Search Team Lead (Golang)
по итогам собеседования
Golang-разработчик
Пермь, по итогам собеседования

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