Rich comparisons Python: ранжирование объектов разных классов

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Сравнение и хеширование Python: задачи на eq, lt и set.

Ранжирование ставок на аукционе

На закрытых торгах участники заявляют предложения двух видов: обычные денежные залоги и золотые векселя с фиксированным номиналом и премиальным статусом клиента. Торговая система ранжирует поступающие заявки строго по сумме. Если же суммы оказываются одинаковыми, обычная ставка уступает премиальному векселю, а заявки одной категории с равными суммами признаются равнозначными.

Программа распределяет ответственность между двумя типами объектов. Класс обычной ставки не знает о внутреннем устройстве премиального векселя и при прямом сравнении с ним возвращает NotImplemented. Этот сигнал позволяет механизму rich comparisons автоматически обратиться к отражённому оператору более сложного класса векселя и корректно определить старшинство.

Реализуйте классы обоих типов ставок так, чтобы любые сравнения между ними разрешались без ошибок типов по правилам торговой системы.

Что уже дано

В редакторе представлены заготовки классов CashBid и GoldBill с заглушками методов __init__, __eq__, __lt__ и __gt__. Вспомогательные функции для наблюдения за проверками доступны в окружении при запуске.

Что нужно сделать

Реализуйте классы CashBid(amount: int) и GoldBill(amount: int).

Каждый класс принимает аргумент amount (целое число от 0 до 1_000_000_000) и сохраняет его в атрибуте экземпляра amount. В серии может проверяться от 0 до 1000 ставок.

Для обоих классов реализуйте методы rich comparisons: __eq__, __lt__ и __gt__. Операторы ==, !=, < и > должны строго следовать правилам:

  • Сначала сравниваются суммы заявок: предложение с большей суммой всегда старше независимо от категории.
  • Если суммы равны, обычная ставка CashBid считается меньше премиального векселя GoldBill.
  • Две заявки одной категории с равными суммами считаются равными.
  • Методы CashBid умеют сравнивать экземпляр только с другим CashBid. Если в методы __eq__, __lt__ или __gt__ класса CashBid передан объект GoldBill или любой посторонний объект, метод обязан вернуть специальное значение NotImplemented.
  • Методы GoldBill умеют сравнивать экземпляр как с другим GoldBill, так и со ставкой CashBid. Результатом успешного сравнения должно быть булево значение (True или False). Если передан посторонний объект, методы GoldBill возвращают NotImplemented.
  • Реализовывать методы __hash__, __repr__, __str__, __le__ или __ge__, а также проверку валидности входных аргументов конструктора не требуется.

Ввод и вывод

Потоки stdin и stdout не используются: считывать ввод и вызывать print() в решении не требуется. Проверяющая система выполняет код ученика, получает из глобального пространства имён классы верхнего уровня CashBid и GoldBill, создаёт их экземпляры и тестирует работу операторов сравнения.

Пример использования

cash = CashBid(40)
bill = GoldBill(40)
print(cash < bill, bill > cash, cash == bill)
print(CashBid.__lt__(cash, bill) is NotImplemented)

Вывод:

True True False
True
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи