Трета задача
- Краен срок
- 26.04.2011 14:00
Срокът за предаване на решения е отминал
(списък с редакциите от публикуването до момента - тук)
Да се реализира клас Lazy
, който представлява число с отложено пресмятане на аритметичните операции. Ще наричаме тези числа "мързеливи".
Класът трябва да предоставя следната функционалност:
Конструктор
... който по един аргумент (число или мързеливо число) инстанцира "мързеливо" число със съответната стойност.
Пример:
>>> lazy_int = Lazy(42)
>>> lazy_complex = Lazy(5.0 + 1.0j)
>>> lazy_number = Lazy(lazy_int)
Бинарни (двуместни) оператори: +
, -
, *
, /
, //
, %
Те се прилагат на двойка "мързеливи" числа или на "мързеливо" и обикновено число. Всички оператори трябва да връщат нова инстанция на мързеливо число. Новото мързеливо число трябва да пази информация за двете числа и оператора, но да НЕ прилага оператора на числата. Целта е "мързеливото" число да изглежда като двоично дърво, чиито поддървета са мързеливи [или обикновено] числа, а във възлите има оператори.
Пример:
>>> lazy_number = (Lazy(1) + 2) * (3 + Lazy(4)) - 8
Унарни (едноместни) оператори: +
, -
Те се прилагат на "мързеливо" число и връщат ново мързеливо число. Новото мързеливо число трябва да пази информация за числото и оператора, но да НЕ прилага оператора на числото.
Пример:
>>> lazy_number = - Lazy(1)
Член функция force
Няма аргументи, кара "мързеливото" число да сметне стойността си.
Пример:
>>> lazy_number = Lazy(8) + Lazy(42)
>>> number = lazy_number.force()
>>> print(number)
50
Функции __bool__
, __int__
, __float__
, __str__
Тези функции карат числото да се изчисли и след това го преобразуват до съответния тип
Пример:
>>> lazy_number = Lazy(3)
>>> three = float(lazy_number)
>>> print(three)
3.0
Забележки:
- Не правете проверка за типа на аргумента на конструктора, а разчитайте на валиден вход.
- Отделете време и погледнете примерния тест преди да започнете да пишете код.
- Не забравяйте за "десните" и "левите" оператори.
- Можете да подходите към задачата по различни начини. Някои идеи, които можете да ползвате са:
- дърво с оператори във възлите и числа в листата
- йерархия от наследници на
Lazy
- заигравка с ламбда функции
- ... и т.н.