Олимпиадный тренинг

Задача . Свой мир. 01. Первый блок


Задача

Темы:

В мире пока ничего нет — только серая плоскость. Ты кладёшь первый блок камня и сразу упираешься в вопрос: сколько времени по нему бить? У руды та же порода вокруг, но возни с ней больше.

Время добычи блока — твёрдость, умноженная на три тика. Руда — тот же блок, но требует дополнительных тиков сверху. Дописать OreBlock так, чтобы не дублировать код Block: и конструктор, и расчёт времени обращаются к родителю через super(). __str__ переопределять нельзя — он обязан работать для обоих.

Структура программы

Отправляется целая программа. Ниже — то, что в ней должно быть объявлено: имена классов, их родители и сигнатуры методов. Имена менять нельзя, проверки обращаются именно к ним.

class Block:
    TICKS_PER_HARDNESS = 3

    def __init__(self, name, hardness):
        self.name = name
        self.hardness = hardness

    def mine_time(self):
        return self.hardness * self.TICKS_PER_HARDNESS

    def __str__(self):
        return f"{self.name}: {self.mine_time()}"


class OreBlock(Block):
    # TODO: __init__(self, name, hardness, extra) — через super()
    # TODO: mine_time() — время блока + extra, через super()
    pass

Как проверяется

Проверяющая программа дописывает к твоему коду блок проверок и выполняет всё вместе. Задача засчитывается, если ни одна проверка не сработала и программа ничего не напечатала — отладочную печать перед отправкой убери.

Примеры проверок

#!requires Block: mine_time, __str__
#!requires OreBlock: mine_time

# подготовка
ore = OreBlock("Алмазная руда", 10, 20)

# проверка
assert ore.mine_time() == 50
#!requires Block: mine_time, __str__
#!requires OreBlock: mine_time

# подготовка
ore = OreBlock("Алмазная руда", 10, 20)
ore.mine_time() == 50

# проверка
assert str(ore) == "Алмазная руда: 50"

Строки #!requires — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.

Вопрос: почему у руды печатается 50, хотя __str__ описан только в Block?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Block: mine_time, __str__
#!requires OreBlock: mine_time

# подготовка
ore = OreBlock("Алмазная руда", 10, 20)

# проверка
assert ore.mine_time() == 50

                         
2
#!requires Block: mine_time, __str__
#!requires OreBlock: mine_time

# подготовка
ore = OreBlock("Алмазная руда", 10, 20)
ore.mine_time() == 50

# проверка
assert str(ore) == "Алмазная руда: 50"

                         
Статистика успешных решений по компиляторам
Комментарий учителя