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

Задача . Свой мир. 10. Свойства блоков


Задача

Темы:

Пора решить, что горит. Доски горят, песок падает, а мокрая губка вроде бы деревяшка, но огонь на ней только шипит. Свойства не выстраиваются в одну линейку: блок может быть и падающим, и горючим одновременно.

Собрать три блока из готовых кусков. Тела классов пустые — всё достаётся по наследству. У Waterlogged и Flammable метод называется одинаково: побеждает тот класс, что стоит раньше в списке баз.

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

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

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

    def place(self):
        return f"ставим: {self.name}"


class Flammable:
    def burn(self):
        return "сгорает"


class Waterlogged:
    def burn(self):
        return "шипит и гаснет"


class Falling:
    def fall(self):
        return "падает вниз"


# TODO: class Planks     — блок, горючий
# TODO: class Sand       — блок, падающий
# TODO: class WetSponge  — мокрый (важнее), горючий, блок

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

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

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

#!requires Block: place
#!requires Flammable: burn
#!requires Waterlogged: burn
#!requires Planks
#!requires Sand
#!requires WetSponge

# подготовка
planks = Planks("Доски")

# проверка
assert planks.place() == "ставим: Доски"
assert planks.burn() == "сгорает"
#!requires Block: place
#!requires Flammable: burn
#!requires Waterlogged: burn
#!requires Planks
#!requires Sand
#!requires WetSponge

# подготовка
planks = Planks("Доски")
planks.place() == 'ставим: Доски'
planks.burn() == 'сгорает'
sand = Sand("Песок")

# проверка
assert sand.place() == "ставим: Песок"

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

Вопрос: губка унаследована и от Waterlogged, и от Flammable, у обоих есть burn(). Что будет, если поменять их местами в списке баз?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Block: place
#!requires Flammable: burn
#!requires Waterlogged: burn
#!requires Planks
#!requires Sand
#!requires WetSponge

# подготовка
planks = Planks("Доски")

# проверка
assert planks.place() == "ставим: Доски"
assert planks.burn() == "сгорает"

                         
2
#!requires Block: place
#!requires Flammable: burn
#!requires Waterlogged: burn
#!requires Planks
#!requires Sand
#!requires WetSponge

# подготовка
planks = Planks("Доски")
planks.place() == 'ставим: Доски'
planks.burn() == 'сгорает'
sand = Sand("Песок")

# проверка
assert sand.place() == "ставим: Песок"

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