Добыча за день свалена в кучу: уголь, медь, немного золота и два алмаза. Сортировать её по алфавиту бессмысленно — «алмаз» окажется впереди «золота» просто по букве. Нужен порядок по ценности, а при равной ценности — по количеству.
Класс 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)
|
|