Модуль 26. Задача 5. Количество строк
Модуль 26. Задача 4. Последовательность Хофштадтера

Модуль 26. Задача 4. Последовательность Хофштадтера

Реализуйте генерацию последовательности Q Хофштадтера (итератором или генератором). Сама последовательность выглядит так:

Q(n)=Q(n−Q(n−1))+Q(n−Q(n−2))

В итератор (или генератор) передаётся список из двух чисел. Например, QHofstadter([1, 1]) генерирует точную последовательность Хофштадтера. Если передать значения [1, 2], то последовательность должна немедленно завершиться.

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 3. Пути файлов

Модуль 26. Задача 3. Пути файлов

Реализуйте функцию gen_files_path, которая рекурсивно проходит по всем каталогам указанной директории (по умолчанию — корневой диск), находит указанный пользователем каталог и генерирует пути всех встреченных файлов.

Подсказка:

Существует функция, которая может получать все имена файлов в дереве каталогов. Попробуйте найти ее самостоятельно.

ЧИТАТЬ ДАЛЕЕ …
git@bitbucket.org: Permission denied (publickey).
Заметка

git@bitbucket.org: Permission denied (publickey).

Что-то я давненько ничего не выкладывал на Bitbucket, и вот на днях создав новый репозиторий не смог его себе склонировать. К удивлению получил ошибку «git@bitbucket.org: Permission denied (publickey).» Не помню, чтобы я что-то менял у себя в ключах, но как-то это нужно было исправлять.
И вот, немного по гуглив всё починил.
Для себя нашел такое решение:

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 2. Рефакторинг

Модуль 26. Задача 2. Рефакторинг

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

# Нужно найти, какие два числа из списков в результате попарного перемножения дадут число 56.
list_1 = [2, 5, 7, 10]
list_2 = [3, 8, 4, 9]
to_find = 56
can_continue = True
for x in list_1:
    for y in list_2:
        result = x * y
        print(x, y, result)
        if result == to_find:
            print('Found!!!')
            can_continue = False
            break
    if not can_continue:
        break

Проблема кода состоит в некрасивом выходе из циклов (два break и флаг). Реализуйте более красивый выход из циклов, используя генератор. Сам алгоритм решения (попарное перемножение) и списки трогать нельзя.

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 1. Квадраты чисел

Модуль 26. Задача 1. Квадраты чисел

Пользователь вводит число N. Напишите программу, которая генерирует последовательность из квадратов чисел от 1 до N (1 ** 2, 2 ** 2, 3 ** 2 и так далее). Реализацию напишите тремя способами: класс-итератор, функция-генератор и генераторное выражение.

Таблица квадратов натуральных чисел от 1 до 120
ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 7. Стек

Модуль 25. Задача 7. Стек

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

Стек — это абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Простой пример: стек из книг на столе. Единственной книгой, чья обложка видна, является самая верхняя. Чтобы получить доступ к, например, третьей снизу книге, нам нужно убрать все книги, лежащие сверху, одну за другой.

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

После этого напишите ещё один класс — «Менеджер задач». В менеджере задач можно выполнить команду «новая задача», в которую передаётся сама задача (str) и её приоритет (int). Сам менеджер работает на основе стека (не наследование!). При выводе менеджера в консоль все задачи должны быть отсортированы по приоритету: чем меньше число, тем выше задача.

Вот пример основной программы:

manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)

Результат:
1 отдохнуть
2 поесть; сдать дз
4 сделать уборку; помыть посуду

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

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 6. Совместное проживание 2

Модуль 25. Задача 6. Совместное проживание 2

Артём увлёкся предыдущим экспериментом и решил расширить его, создав целую семью из Мужа, Жены и Кота. Условия эксперимента следующие.
Каждый день участники жизни могут делать только одно действие. Все вместе они должны прожить год и не умереть.

Муж может:

  • есть;
  • играть;
  • ходить на работу.

Жена может:

  • есть;
  • покупать продукты;
  • покупать шубу;
  • убираться в доме.

Кот может:

  • есть;
  • спать;
  • драть обои.

Все они живут в одном доме, дом характеризуется:

  • количеством денег в тумбочке (вначале 100);
  • количеством еды в холодильнике (вначале 50);
  • едой для кота (вначале 30);
  • количеством грязи (вначале 0).

У людей есть имя, степень сытости (вначале 30) и степень счастья (вначале 100). Все люди могут гладить кота (+5 к счастью).
У кота есть имя и степень сытости (вначале 30).
Любое действие (в том числе и кота), кроме «есть», приводит к уменьшению степени сытости на 10 пунктов.
Взрослые едят максимум по 30 единиц еды, степень сытости растёт на один пункт за один пункт еды.
Кот ест максимум по 10 единиц еды, степень сытости растёт на два пункта за один пункт еды.
Степень сытости не должна падать ниже нуля, иначе человек или кот умрёт от голода.
Деньги в тумбочку добавляет муж после работы — сразу 150 единиц.
Еда стоит 10 денег за 10 единиц еды. Шуба стоит 350 единиц.
Еда для кота тоже покупается — за 10 денег 10 еды.
Грязь добавляется каждый день по пять пунктов, за одну уборку жена может убирать до 100 единиц грязи.
Если кот дерёт обои, то грязи тоже становится больше на пять пунктов.
Если в доме грязи больше 90, у людей падает степень счастья каждый день на 10 пунктов.
Степень счастья растёт: у мужа от игры в компьютер (на 20), у жены от покупки шубы (на 60, но шуба дорогая).
Степень счастья не должна падать ниже 10, иначе человек умирает от депрессии.
Реализуйте такую программу. Подведите итоги жизни за год — сколько было заработано денег, сколько съедено еды, сколько куплено шуб.
Дополнительно: добавьте ещё ребёнка и несколько котов.

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 5. А-а-автомобиль!

Модуль 25. Задача 5. А-а-автомобиль!

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

Реализуйте класс автомобиля, а также класс, который будет описывать автобус. У автобуса, кроме того, что имеется у автомобиля, должны быть поля, содержащие число пассажиров и количество полученных денег, изначально равное нулю. Также должны быть методы «войти» и «выйти», изменяющие число пассажиров. Наконец, метод move должен быть переопределён, чтобы увеличивать количество денег в соответствии с количеством пассажиров и пройденным расстоянием.

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 4. Компания

Модуль 25. Задача 4. Компания

Реализуйте иерархию классов, описывающих служащих в компании. На самом верху иерархии — класс Person, который описывает человека именем, фамилией и возрастом. Все атрибуты этого класса являются приватными.

Далее идёт класс Employee и производные от него классы Manager, Agent и Worker.

Класс «Работник» должен иметь метод расчёта заработной платы, переопределённый в каждом из производных классов. Заработная плата Manager постоянна и равна 13000, заработная плата Agent определяется как оклад 5000 + 5% от объёма продаж, который хранится в специальном поле класса Agent, а заработная плата Worker определяется как 100 * число отработанных часов, которое также хранится в отдельном поле.

В основной программе создайте список из девяти объектов: первые три — Manager, следующие три — Agent и последние три — Worker. Выведите на экран величину заработной платы всех девяти служащих.

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 3. Свой словарь

Модуль 25. Задача 3. Свой словарь

В силу обстоятельств Васе постоянно приходится работать со словарями и их данными. В том числе и с методом get, который по умолчанию возвращает None, если такого ключа в словаре нет. Однако Васю это не устраивает: для нормальной работы ему нужно возвращать число 0.

Реализуйте класс MyDict, который будет вести себя точно так же, как и обычный словарь, за исключением того, что метод get по умолчанию будет возвращать не None, а число 0.

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 2. Карма

Модуль 25. Задача 2. Карма

Один буддист-программист решил создать свой симулятор жизни, в котором нужно набрать 500 очков кармы (это константа), чтобы достичь просветления.

Каждый день вызывается специальная функция one_day(), которая возвращает количество кармы от 1 до 7 и может с вероятностью 1 к 10 выкинуть одно из исключений:

  • KillError;
  • DrunkError;
  • CarCrashError;
  • GluttonyError;
  • DepressionError.

Напишите такую программу. Функцию оберните в бесконечный цикл, выход из которого возможен только при накоплении кармы до уровня константы. Исключения обработайте и запишите в отдельный лог karma.log.

ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 1. Налоги

Модуль 25. Задача 1. Налоги

Реализуйте иерархию классов, описывающих имущество налогоплательщиков. Она должна состоять из базового класса Property и производных от него классов Apartment, Car и CountryHouse.

Базовый класс должен иметь атрибут worth (стоимость), который передаётся в конструктор, и метод расчёта налога, переопределённый в каждом из производных классов. Налог на квартиру вычисляется как 1/1000 её стоимости, на машину — 1/200, на дачу — 1/500.

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

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

ЧИТАТЬ ДАЛЕЕ …
Модуль 24. Задача 9. Крестики-нолики

Модуль 24. Задача 9. Крестики-нолики

Напишите программу, которая реализует игру «Крестики-нолики». Да, это всё условие задачи.

Ваши классы в этой задаче могут выглядеть так:

class Cell:
    #  Клетка, у которой есть значения
    #   - занята она или нет
    #   - номер клетки
    pass

class Board:
    #  Класс поля, который создаёт у себя экземпляры клетки
    pass

class Player:
    #  У игрока может быть
    #   - имя
    #   - на какую клетку ходит
    pass
ЧИТАТЬ ДАЛЕЕ …
Модуль 24. Задача 8. Блек-джек

Модуль 24. Задача 8. Блек-джек

Костя так и не смог завязать с азартными играми. Но перед тем как в очередной раз всё проиграть, он решил как следует подготовиться. И написать программу, на которой он будет тренироваться играть в блек-джек.

Блек-джек также известен как 21. Суть игры проста: нужно или набрать ровно 21 очко, или набрать очков больше, чем в руках у дилера, но ни в коем случае не больше 21. Если игрок собирает больше 21, он «сгорает». В случае ничьей игрок и дилер остаются при своих.

Карты имеют такие «ценовые» значения:

  • от двойки до десятки — от 2 до 10 соответственно;
  • у туза — 1 или 11 (11 пока общая сумма не больше 21, далее 1);
  • у «картинок» (король, дама, валет) — 10.

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

Представление карты реализуйте с помощью класса.

Дополнительно: сделайте так, чтобы карты не могли повторяться.

Ваши классы в этой задаче могут выглядеть так:

class Card:
    #  Карта, у которой есть значения
    #   - масть
    #   - ранг/принадлежность 2, 3, 4, 5, 6, 7 и так далее
    pass

class Deck:
    #  Колода создаёт у себя объекты карт
    pass

class Player:
    #  Игрок, у которого есть имя и какие-то карты на руках
    pass
ЧИТАТЬ ДАЛЕЕ …