Паттерн decorator добавляет поведение, оборачивая объект слоями. Каждый слой здесь меняет цену слоя внутри него.
Начните с base_price и применяйте декораторы по порядку:
discount p: уменьшить цену на p процентов.tax p: увеличить цену на p процентов.shipping a: прибавить фиксированную сумму a.coupon a: вычесть a, но не опускаться ниже 0.
Реализуйте price_decorators(base_price, decorators).
Входные данные
base_price: начальная цена.
decorators: слои в том порядке, в котором они оборачивают цену. Суммы могут быть дробными.
Выходные данные
Верните итоговую цену. Ответы с погрешностью до 1e-6 принимаются.
Ограничения
0 ≤ base_price ≤ 1,000,000
0 ≤ число декораторов ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
Примеры
Ввод:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
Ожидаемый вывод:
expected = 102.2
Ввод:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
Ожидаемый вывод:
double expected = 102.2;
Ввод:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
Ожидаемый вывод:
double expected = 102.2;
Пояснение
100 − 10% = 90, плюс 8% налога = 97.2, плюс 5 за доставку = 102.2.
Ввод:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
Ожидаемый вывод:
expected = 4.0
Ввод:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
Ожидаемый вывод:
double expected = 4.0;
Ввод:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
Ожидаемый вывод:
double expected = 4.0;
Пояснение
Купон опустил бы цену ниже нуля, поэтому она останавливается на 0; затем доставка делает её 4.
Как подступиться
Сначала попробуйте сами, затем открывайте подсказки по одной.
Подсказка 1
Применяйте слои строго в заданном порядке.
Подсказка 2
Проценты считаются от текущей цены, а не от исходной.
Подсказка 3
Купон никогда не опускает цену ниже 0.
Ожидаемая сложность
время O(число декораторов), доп. память O(1)
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.