В мире пока ничего нет — только серая плоскость. Ты кладёшь первый блок камня и сразу упираешься в вопрос: сколько времени по нему бить? У руды та же порода вокруг, но возни с ней больше.
Время добычи блока — твёрдость, умноженная на три тика. Руда — тот же блок, но требует дополнительных тиков сверху. Дописать 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"
|
|