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

Задача . Свой мир. 02. Верстак


Задача

Темы:

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

Кирка добывает со скоростью power * level. Каменная кирка — та же кирка, но уровень у неё всегда 2, поэтому своего speed() у неё быть не должно. Динамит считает иначе: power * 7. Голые руки (Tool) дают скорость 1 — базовый класс работает, просто плохо. Функция total_speed работает с любым списком и ничего не знает о видах инструментов.

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

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

class Tool:
    def speed(self):
        return 1

    def name(self):
        return type(self).__name__


class Pickaxe(Tool):
    # TODO: __init__(self, power, level), speed() -> power * level
    pass


class StonePickaxe(Pickaxe):
    # TODO: __init__(self, power) — через super(), уровень = 2; speed() НЕ писать
    pass


class Tnt(Tool):
    # TODO: __init__(self, power), speed() -> power * 7
    pass


def total_speed(tools):
    # TODO: суммарная скорость произвольного набора инструментов
    ...

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

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

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

#!requires Tool: speed, name
#!requires Pickaxe: speed
#!requires StonePickaxe
#!requires Tnt: speed

# подготовка
kit = [Pickaxe(3, 4), StonePickaxe(5), Tnt(2)]

# проверка
assert total_speed(kit) == 36
#!requires Tool: speed, name
#!requires Pickaxe: speed
#!requires StonePickaxe
#!requires Tnt: speed

# подготовка
kit = [Pickaxe(3, 4), StonePickaxe(5), Tnt(2)]

# проверка
assert [t.name() for t in kit] == ["Pickaxe", "StonePickaxe", "Tnt"]

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

Вопрос: метод name() написан один раз в Tool, а возвращает разные названия. Почему?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Tool: speed, name
#!requires Pickaxe: speed
#!requires StonePickaxe
#!requires Tnt: speed

# подготовка
kit = [Pickaxe(3, 4), StonePickaxe(5), Tnt(2)]

# проверка
assert total_speed(kit) == 36

                         
2
#!requires Tool: speed, name
#!requires Pickaxe: speed
#!requires StonePickaxe
#!requires Tnt: speed

# подготовка
kit = [Pickaxe(3, 4), StonePickaxe(5), Tnt(2)]

# проверка
assert [t.name() for t in kit] == ["Pickaxe", "StonePickaxe", "Tnt"]

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