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

Задача . Свой мир. 11. Ночная волна


Задача

Темы:

Солнце садится, и из темноты выходят трое. Зомби бьёт в лоб — броня его держит. Скелет стреляет в щели, половину брони можно не считать. Крипер не бьёт вообще: он взрывается, и броня против взрыва не работает.

  • Mob(name, hp, power): метод damage(armor) возвращает power - armor, метод attack(armor) — общий каркас max(0, damage(armor)). attack пишется один раз в базовом классе и больше нигде;
  • __str__ → "Creeper Крипер (20 hp)" — вид моба берётся через type();
  • Zombie(Mob) — не меняет ничего;
  • Skeleton(Mob) — damage считает power - armor // 2;
  • Creeper(Mob) — damage возвращает power + 10, броню игнорирует;
  • функция night_damage(mobs, armor) — суммарный урон всей волны.

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

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

class Mob:
    def __init__(self, name, hp, power):
        ...

    def damage(self, armor):
        ...

    def attack(self, armor):
        ...

    def __str__(self):
        ...

class Zombie(Mob):
    ...

class Skeleton(Mob):
    def damage(self, armor):
        ...

class Creeper(Mob):
    def damage(self, armor):
        ...

def night_damage(mobs, armor):
    ...

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

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

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

#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper

# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]

# проверка
assert [m.attack(10) for m in horde] == [10, 15, 60]
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper

# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
[m.attack(10) for m in horde] == [10, 15, 60]

# проверка
assert night_damage(horde, 10) == 85

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

Вопрос: в теле Zombie не написано ни строчки, а зомби бьёт. Откуда он берёт damage и attack?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper

# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]

# проверка
assert [m.attack(10) for m in horde] == [10, 15, 60]

                         
2
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper

# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
[m.attack(10) for m in horde] == [10, 15, 60]

# проверка
assert night_damage(horde, 10) == 85

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