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

Задача . Свой мир. 09. Перепись мобов


Задача

Темы:

Отладочная панель показывает две цифры: сколько вокруг враждебных существ вообще (крипер ведь тоже враждебный) и сколько среди них именно зомби, без наследников и допущений.

isinstance отвечает на вопрос «является ли разновидностью», type(x) is C — «ровно этот класс».

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

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

# дано: классы из главы 3, упрощённые
class Mob:
    def __init__(self, name):
        self.name = name


class Hostile(Mob):
    pass


class Creeper(Hostile):
    pass


def count_hostile(mobs):
    # TODO: сколько объектов враждебны, включая наследников
    ...


def count_exact(mobs, cls):
    # TODO: сколько объектов ровно класса cls
    ...


def describe(mob):
    # TODO: "<имя> — <класс>, враждебный" либо "<имя> — <класс>, мирный"
    ...

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

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

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

#!requires Mob
#!requires Hostile
#!requires Creeper

# подготовка
crowd = [Mob("Корова"), Hostile("Зомби"), Creeper("Крипер")]

# проверка
assert count_hostile(crowd) == 2
#!requires Mob
#!requires Hostile
#!requires Creeper

# подготовка
crowd = [Mob("Корова"), Hostile("Зомби"), Creeper("Крипер")]

# проверка
assert count_exact(crowd, Hostile) == 1

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

Вопрос: почему count_hostile даёт 2, а count_exact(crowd, Hostile) — 1?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Mob
#!requires Hostile
#!requires Creeper

# подготовка
crowd = [Mob("Корова"), Hostile("Зомби"), Creeper("Крипер")]

# проверка
assert count_hostile(crowd) == 2

                         
2
#!requires Mob
#!requires Hostile
#!requires Creeper

# подготовка
crowd = [Mob("Корова"), Hostile("Зомби"), Creeper("Крипер")]

# проверка
assert count_exact(crowd, Hostile) == 1

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