Все задачи
Легко Решено: 0 Процент решений: 0%

Декораторы цены

Оберните базовую цену в декораторы скидки, налога, доставки и купона, применяемые по порядку.

Чему вы научитесь

  • Наслаивать поведение вокруг значения
  • Применять проценты в правильном порядке
  • Не давать значению опуститься ниже нуля

Условие

Паттерн 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

Примеры

Пример 1
Ввод:
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.

Пример 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. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

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