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

Задача . Свой мир. 07. Что ценнее


Задача

Темы:

Добыча за день свалена в кучу: уголь, медь, немного золота и два алмаза. Сортировать её по алфавиту бессмысленно — «алмаз» окажется впереди «золота» просто по букве. Нужен порядок по ценности, а при равной ценности — по количеству.

Класс Ore(kind, amount) с готовым списком ценности:

KINDS = ("уголь", "медь", "железо", "золото", "алмаз", "незерит")
  • вспомогательный метод key() возвращает пару «номер вида, количество» — сравнивать удобно именно кортежи;
  • написать __eq__, __lt__, __le__, __gt__, __ge__. Операция != получится сама из __eq__ — её писать не надо;
  • str(ore) → "алмаз x2", repr(ore) → "Ore('алмаз', 2)";
  • сортировка списка руды должна заработать сама.

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

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

class Ore:
    KINDS = ('уголь', 'медь', 'железо', 'золото', 'алмаз', 'незерит')

    def __init__(self, kind, amount):
        ...

    def key(self):
        ...

    def __eq__(self, other):
        ...

    def __lt__(self, other):
        ...

    def __le__(self, other):
        ...

    def __gt__(self, other):
        ...

    def __ge__(self, other):
        ...

    def __str__(self):
        ...

    def __repr__(self):
        ...

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

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

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

#!requires Ore: __eq__, __lt__, __le__, __gt__, __ge__, __str__, __repr__

# проверка
assert Ore("алмаз", 1) > Ore("золото", 64)
assert Ore("уголь", 5) == Ore("уголь", 5)
#!requires Ore: __eq__, __lt__, __le__, __gt__, __ge__, __str__, __repr__

# проверка
assert Ore("уголь", 5) < Ore("уголь", 9)

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

Вопрос: один алмаз ценнее шестидесяти четырёх золотых слитков — так решает key(). Что вернёт сравнение, если сравнивать kind как строки? Проверь в интерпретаторе.

---


Примеры
№Входные данныеВыходные данные
1
#!requires Ore: __eq__, __lt__, __le__, __gt__, __ge__, __str__, __repr__

# проверка
assert Ore("алмаз", 1) > Ore("золото", 64)
assert Ore("уголь", 5) == Ore("уголь", 5)

                         
2
#!requires Ore: __eq__, __lt__, __le__, __gt__, __ge__, __str__, __repr__

# проверка
assert Ore("уголь", 5) < Ore("уголь", 9)

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