Подборка задач с решениями - 18

  • Категория: Python
  • Дата публикации: 2022-01-12
  • Опубликовано на сайте: Stepik

Подборка беспощадных заданий от Института биоинформатики (Python курсы на Stepik).

Задача 1:

Вам дано описание наследования классов в формате JSON. Описание представляет из себя массив JSON-объектов, которые соответствуют классам. У каждого JSON-объекта есть поле name, которое содержит имя класса, и поле parents, которое содержит список имен прямых предков.

Пример: [{"name": "A", "parents": []}, {"name": "B", "parents": ["A", "C"]}, {"name": "C", "parents": ["A"]}]

Эквивалент на Python:

Гарантируется, что никакой класс не наследуется от себя явно или косвенно, и что никакой класс не наследуется явно от одного класса более одного раза.

Для каждого класса вычислите предком скольких классов он является и выведите эту информацию в следующем формате.

<имя класса> : <количество потомков>

Выводить классы следует в лексикографическом порядке.

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 2:

Вам дано описание наследования классов в следующем формате. <имя класса 1> : <имя класса 2> <имя класса 3> ... <имя класса k> Это означает, что класс 1 отнаследован от класса 2, класса 3, и т. д.

Или эквивалентно записи:

Класс A является прямым предком класса B, если B отнаследован от A:

Класс A является предком класса B, если:

  • A = B;
  • A - прямой предок B
  • существует такой класс C, что C - прямой предок B и A - предок C

Например:

A -- предок С

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

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 3:

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

Операция сложения на стеке определяется следующим образом. Со стека снимается верхний элемент (top1), затем снимается следующий верхний элемент (top2), и затем как результат операции сложения на вершину стека кладется элемент, равный top1 + top2.

Аналогичным образом определяются операции вычитания (top1 - top2), умножения (top1 * top2) и целочисленного деления (top1 // top2).

Реализуйте эту структуру данных как класс ExtendedStack, отнаследовав его от стандартного класса list.

Требуемая структура класса:

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 4:

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

Рассмотрим класс Loggable:

У него есть ровно один метод log, который позволяет выводить в лог (в данном случае в stdout) какое-то сообщение, добавляя при этом текущее время. Реализуйте класс LoggableList, отнаследовав его от классов list и Loggable таким образом, чтобы при добавлении элемента в список посредством метода append в лог отправлялось сообщение, состоящее из только что добавленного элемента.

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 5:

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

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

Вашей программе на вход подаются следующие запросы:

  • create – создать новое пространство имен с именем внутри пространства

  • add – добавить в пространство переменную

  • get – получить имя пространства, из которого будет взята переменная при запросе из пространства , или None, если такого пространства не существует

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 6:

Реализуйте программу, которая будет вычислять количество различных объектов в списке. Два объекта a и b считаются различными, если a is b равно False.

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

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 7:

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

Но последовательность не дается вам сразу целиком. С течением времени к вам поступают её последовательные части. Например, сначала первые три элемента, потом следующие шесть, потом следующие два и т. д.

Реализуйте класс Buffer, который будет накапливать в себе элементы последовательности и выводить сумму пятерок последовательных элементов по мере их накопления.

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

Класс должен иметь следующий вид

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 8:

Реализуйте класс MoneyBox, для работы с виртуальной копилкой.

Каждая копилка имеет ограниченную вместимость, которая выражается целым числом – количеством монет, которые можно положить в копилку. Класс должен поддерживать информацию о количестве монет в копилке, предоставлять возможность добавлять монеты в копилку и узнавать, можно ли добавить в копилку ещё какое-то количество монет, не превышая ее вместимость.

Класс должен иметь следующий вид

При создании копилки, число монет в ней равно 0.

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 9:

Вам дано описание наследования классов исключений в следующем формате. <имя исключения 1> : <имя исключения 2> <имя исключения 3> ... <имя исключения k> Это означает, что исключение 1 наследуется от исключения 2, исключения 3, и т. д.

Или эквивалентно записи:

class Error1(Error2, Error3 ... ErrorK):

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

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

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 10:

Реализуйте класс PositiveList, отнаследовав его от класса list, для хранения положительных целых чисел. Также реализуйте новое исключение NonPositiveError.

В классе PositiveList переопределите метод append(self, x) таким образом, чтобы при попытке добавить неположительное целое число бросалось исключение NonPositiveError и число не добавлялось, а при попытке добавить положительное целое число, число добавлялось бы как в стандартный list.

В данной задаче гарантируется, что в качестве аргумента x метода append всегда будет передаваться целое число.

Решение:

Все решения теперь можно найти в сообществе Как войти в IT

Задача 11:

Это упрощенный вариант классической сложной задачи об островах. Здесь матрица состоит из 5х5 элементов, однако решение подойдет для массива любого размера - в том числе прямоугольного.

Вводится двумерный список размерностью 5 х 5 элементов, состоящий из нулей и, в некоторых позициях, единиц (см. пример ввода ниже). Требуется проверить, не касаются ли единицы друг друга по горизонтали, вертикали и диагонали. То есть, вокруг каждой единицы должны быть нули. Если проверка проходит вывести ДА, иначе - НЕТ.

Решение:

Все решения теперь можно найти в сообществе Как войти в IT