Голыми руками копать можно, но медленно. На верстаке появляются кирки разных уровней, а один твой приятель предлагает вообще не копать, а взрывать. Счётчик добычи должен работать со всем этим одинаково.
Кирка добывает со скоростью 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"]
|
|