Модуль 21. Задача 9. Ханойские башни

Модуль 21. Задача 9. Ханойские башни

Ниже представлен текст одной из классических головоломок и, по совместительству, алгоритмических задач по программированию. С ней знакомы многие, в том числе и те, кто с программированием никак не связан.

Головоломка “Ханойские башни” состоит из трех стержней, пронумерованных числами 1, 2, 3. На стержень 1 надета пирамидка из N дисков различного диаметра в порядке возрастания диаметра. Диски можно перекладывать с одного стержня на другой по одному, при этом диск нельзя класть на диск меньшего диаметра. Необходимо переложить всю пирамидку со стержня 1 на стержень 3 за минимальное число перекладываний.

Модуль 21. Задача 9. Ханойские башни

Напишите программу, которая решает головоломку; для данного числа дисков N печатает последовательность перекладываний в формате A B C, где A — номер перекладываемого диска, B — номер стержня с которого снимается данный диск, C — номер стержня на который надевается данный диск.

Например, строка 1 2 3 означает перемещение диска номер 1 со стержня 2 на стержень 3. В одной строке печатается одна команда. Диски пронумерованы числами от 1 до n в порядке возрастания диаметров.

Программа должна вывести минимальный (по количеству произведенных операций) способ перекладывания пирамидки из данного числа дисков.
Решение оформите в виде функции move (n, x, y), которая печатает последовательность перекладываний дисков для перемещения пирамидки высоты N со стержня номер X на стержень номер Y.

Пример:

Введите количество дисков: 2
Переложить диск 1 со стержня номер 1 на стержень номер 2
Переложить диск 2 со стержня номер 1 на стержень номер 3
Переложить диск 1 со стержня номер 2 на стержень номер 3
ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 8. Список списков 2

Модуль 21. Задача 8. Список списков 2

Мы уже работали с многомерными списками и решали задачи, где с помощью list comprehensions “выпрямляли” его в один. Однако, такой фокус не пройдёт, если у элементов разные уровни вложенности и этих списков неограниченное количество.

Дан вот такой список:

nice_list = [1, 2, [3, 4], [[5, 6, 7], [8, 9, 10]], 
             [[11, 12, 13], [14, 15], [16, 17, 18]]]

Напишите рекурсивную функцию, которая “раскрывает” все вложенные списки, то есть оставляет только внешний список.

Ответ:

Ответ: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

Подсказка: можно возвращать списки и срезы списков

ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 7. Продвинутая функция sum

Модуль 21. Задача 7. Продвинутая функция sum

Как мы знаем, в Питоне есть полезная функция sum, которая умеет находить сумму элементов списков. Однако, для работы иногда базовых возможностей функций не хватает и приходится их усовершенствовать.

Напишите свою функцию sum, которая должна быть более гибкой, чем стандартная функция sum. Вот что она должна уметь делать:

  • Складывать числа из списка списков
  • Складывать из набора параметров

Основной код оставьте пустым или закомментированным (используйте его только для тестирования).

Примеры вызовов функции:

sum([[1, 2, [3]], [1], 3])
Ответ: 10

sum(1, 2, 3, 4, 5)
Ответ: 15
ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 6. Глубокое копирование

Модуль 21. Задача 6. Глубокое копирование

Вы сделали структуру сайта для заказчика для продажи телефонов

site = {
    'html': {
        'head': {
            'title': 'Куплю/продам телефон недорого'
        },
        'body': {
            'h2': 'У нас самая низкая цена на iphone',
            'div': 'Купить',
            'p': 'продать'
        }
    }
}

Заказчик рассказал своим коллегам на рынке и они тоже захотели такой сайт, только для своих товаров. Вы посчитали, что это легкая задача и быстро принялись за работу.

Напишите программу, которая запрашивает у клиента сколько будет сайтов, а затем запрашивает название продукта и после каждого запроса выводит на экран активные сайты.
Условия структуру сайта нужно описать один раз, копипасту никто не любит.

Подсказка: используйте рекурсию

ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 5. Ускоряем работу функции

Модуль 21. Задача 5. Ускоряем работу функции

У нас есть функция, которая делает определённые действия с входными данными:

  1. Берёт факториал от числа
  2. Результат делит на куб входного числа
  3. И получившиеся число возводит в 10 степень
def calculating_math_func(data):
    result = 1
    for index in range(1, data + 1):
        result *= index
    result /= data ** 3
    result = result ** 10
    return result

Однако каждый раз нам приходится делать сложные вычисления, хотя входные и выходные данные одни и те же. И тут наши знания тонкостей python должны нам помочь.

Оптимизируйте функцию так, чтобы высчитывать факториал для одного и того же числа только один раз.

Подсказка: вспомните что происходит с изменяемыми данными, если их выставить по умолчанию в параметрах функции.

ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 4. Поиск элемента 2

Модуль 21. Задача 4. Поиск элемента 2

Пользователь вводит искомый ключ. Также, если он хочет, то может ввести максимальную глубину, -это уровень, до которого будет просматриваться структура. Напишите функцию, которая находит заданный пользователем ключ в словаре и выдаёт значение этого ключа на экран. По умолчанию уровень не задан. В качестве примера можно использовать вот такой словарь:

site = {
    'html': {
        'head': {
            'title': 'Мой сайт'
        },
        'body': {
            'h2': 'Здесь будет мой заголовок',
            'div': 'Тут, наверное, какой-то блок',
            'p': 'А вот здесь новый абзац'
        }
    }
}

Пример 1:

Введите искомый ключ: head
Хотите ввести максимальную глубину? Y/N: n
Значение ключа: {'title': 'Мой сайт'}
ЧИТАТЬ ДАЛЕЕ …
Модуль 21.  Задача 3. Ряд Фибоначчи

Модуль 21. Задача 3. Ряд Фибоначчи

Числа Фибоначчи – это ряд чисел, в котором каждое следующее число равно сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13, …

Пользователь вводит num_pos. Напишите функцию, которая выводит число, которое стоит на позиции num_pos в ряде Фибоначчи

Числа Фибоначчи

Пример 1:

Введите позицию числа в ряде Фибоначчи: 6

Число: 8
ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 2. Свой zip 2

Модуль 21. Задача 2. Свой zip 2

Написав аналог функции zip на собеседовании вы вспомнили, что этот код можно сделать даже лучше, и резко вырвали листок с кодом из рук работодателя, оставив его в прострации.

Напишите функцию, которая будет являться аналогом функции zip и сделайте так, чтобы программа работала с любыми итерируемыми типами данных.
Циклами (за исключением генераторов), условными операторами и функциями определения типа(isinstance или type) пользоваться нельзя.

Функция должна возвращать список с кортежами, в котором n-ый кортеж состоит из n-ых элементов всех последовательностей.
Например, десятый кортеж будет содержать десятый элемент каждой из переданных последовательностей.

Основной код оставьте пустым или закомментированным (используйте его только для тестирования).

Пример 1:

a = [{‘x’: 4}, ‘b’, ‘z’, ‘d’]
b = (10, {20,}, [30], ‘z’)

print(my_zip(a, b)) -> [({‘x’: 4}, 10), (‘b’, {20}), (‘z’, [30]), (‘d’, ‘z’)]
ЧИТАТЬ ДАЛЕЕ …
Модуль 21. Задача 1. Challenge 2

Модуль 21. Задача 1. Challenge 2

Вдохновившись мотивацией Антона, ваш друг тоже решил поставить перед собой задачу, но не сильно связанную с математикой, а именно — написать функцию, которая выводит все числа от 1 до num без использования циклов. Помогите другу реализовать такую функцию.

Пример работы программы:

Введите num: 10
1
2
3
4
5
6
7
8
9
10
ЧИТАТЬ ДАЛЕЕ …
Модуль 20. Задача 10. Свой zip

Модуль 20. Задача 10. Свой zip

В самом конце собеседования вас неожиданно спросили: “Расскажите, что делает функция zip?”. В итоге, чтобы произвести максимальное впечатление, вы решили не только рассказать про неё, но и написать её аналог.

Даны строка и кортеж из чисел. Напишите программу, которая создаёт генератор из пар кортежей “символ — число”. Затем выведите на экран сам генератор и кортежи

Пример:

Строка: abcd
Кортеж чисел: (10, 20, 30, 40)

Результат:
<generator object <genexpr> at 0x00000204A4234048>
('a', 10)
('b', 20)
('c', 30)
('d', 40)

Дополнительно: создайте полный аналог функции zip, то есть сделайте так, чтобы программа работала с любыми итерируемыми типами данных.

Решение:

Решение можно скачать с Boosty.to


Как можно отблагодарить:

  • Оформить удобную для вас подписку на Boosty.to
  • Разово поддержать через DonationAlerts
Модуль 20. Задача 9. Протокол соревнований

Модуль 20. Задача 9. Протокол соревнований

Вы продолжаете развиваться в геймдеве и в этот раз вам пришло действительно внушительное техническое задание, с описанием правил игр, входными и выходными данными. Вот как оно выглядит:

Здравствуйте! Мы собираемся устраивать соревнования по [данные засекречены] и хотим, чтобы вы написали эффективную программу, которая составляла бы нам протокол и определяла победителя и призёров. О логике работы программы ниже.

Правила соревнований:

  1. Участники имеют право играть несколько раз. Количество попыток одного участника не ограничивается.
  2. Окончательный результат участника определяется по одной игре, лучшей для данного участника.
  3. Более высокое место в соревнованиях занимает участник, показавший лучший результат.
  4. При равенстве результатов более высокое место занимает участник, раньше показавший лучший результат.

Как проходят соревнования:

В ходе соревнований заполняется протокол, каждая строка которого описывает одну игру и содержит результат участника и его игровое имя. Протокол формируется в реальном времени по ходу проведения чемпионата, поэтому строки в нём расположены в порядке проведения игр: чем раньше встречается строка в протоколе, тем раньше закончилась соответствующая этой строке игра.

Напишите программу, которая по данным протокола определяет победителя и призёров. Гарантируется, что в чемпионате участвует не менее трёх игроков.

ЧИТАТЬ ДАЛЕЕ …
Модуль 20. Задача 8. Контакты 3

Модуль 20. Задача 8. Контакты 3

Мы уже помогали Степану с реализацией телефонной книги (контактов) на телефоне, однако внезапно оказалось, что книге не хватает ещё одной очень полезной функции: поиска!

Напишите программу, которая бесконечно запрашивает у пользователя действие, которое он хочет совершить: добавить контакт или найти человека в списке контактов по фамилии.

Действие “добавить контакт”: программа запрашивает имя и фамилию контакта, затем номер телефона, после этого добавляет их в словарь и выводит на экран текущий словарь контактов. Если этот человек уже есть в словаре, то выведете соотвествующее сообщение.

Действие “поиск человека по фамилии”: программа запрашивает фамилию и выводит все контакты с такой фамилией и их номера телефонов. Поиск не должен зависеть от регистра символов.

Пример работы программы:

Введите номер действия: 
 1. Добавить контакт 
 2. Найти человека 
1
Введите имя и фамилию нового контакта (через пробел): Иван Сидоров
Введите номер телефона: 888
Текущий словарь контактов: {('Иван', 'Сидоров'): 888}
Введите номер действия: 
 1. Добавить контакт 
 2. Найти человека 
1
Введите имя и фамилию нового контакта (через пробел): Иван Сидоров
Такой человек уже есть в контактах.
Текущий словарь контактов: {('Иван', 'Сидоров'): 888}
Введите номер действия: 
 1. Добавить контакт 
 2. Найти человека 
1
Введите имя и фамилию нового контакта (через пробел): Алиса Петрова
Введите номер телефона: 999
Текущий словарь контактов: {('Иван', 'Сидоров'): 888, ('Алиса', 'Петрова'): 999}
Введите номер действия: 
 1. Добавить контакт 
 2. Найти человека 
2
Введите фамилию для поиска: Сидоров
Иван Сидоров 888
Введите номер действия: 
 1. Добавить контакт 
 2. Найти человека 
…….
ЧИТАТЬ ДАЛЕЕ …
Модуль 20. Задача 7. Функция сортировки

Модуль 20. Задача 7. Функция сортировки

Напишите функцию, которая сортирует кортеж, состоящий из целых чисел по возрастанию и возвращает его. Если хотя бы один элемент не является целым числом, то функция возвращает исходный кортеж.

Основной код оставьте пустым или закомментированным (используйте его только для тестирования).

Пример вызова функции:

print(tpl_sort(6, 3, -1, 8, 4, 10, -5))
Ответ в консоли: (-5, -1, 3, 4, 6, 8, 10)
ЧИТАТЬ ДАЛЕЕ …
Модуль 20. Задача 6. По парам

Модуль 20. Задача 6. По парам

Напишите программу, которая инициализирует список из 10 случайных целых чисел, а затем делит эти числа на пары кортежей внутри списка. Выведите результат на экран.

Дополнительно: решите задачу несколькими способами

Пример:

Оригинальный список: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Новый список: [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
ЧИТАТЬ ДАЛЕЕ …
Модуль 20. Задача 5. Одна семья

Модуль 20. Задача 5. Одна семья

В одной базе данных хранится информация о членах нескольких разных семей. Хранение реализовано с помощью словаря с парами “ФИ — возраст”.

Инициализируйте словарь членов семей (ФИ и возраст используйте любые) и напишите программу, которая запрашивает у пользователя фамилию и выводит на экран возраст всех членов одной семьи. Учтите, что, например, у двух людей разного пола, фамилии отличаются окончанием. Поиск не должен быть регистрозависимым.

Пример реализации:

Введите фамилию: Сидоров

Сидоров Никита 35
Сидорова Алина 34
Сидоров Павел 10
ЧИТАТЬ ДАЛЕЕ …