Problema
O padrão decorator adiciona comportamento ao envolver um objeto em camadas. Cada camada aqui altera o preço da camada interna.
Comece em base_price e aplique os decoradores nesta ordem:
discount p: reduz o preço em p por cento.tax p: aumenta o preço em p por cento.shipping a: adiciona um valor fixo a.coupon a: subtrai a, mas nunca deixa passar de 0.
Implemente price_decorators(base_price, decorators).
Input
base_price: O preço inicial.
decorators: As camadas, na ordem em que envolvem o preço. Os valores podem ter decimais.
Output
Retorne o preço final. Respostas dentro de 1e-6 são aceitas.
Restrições
0 ≤ base_price ≤ 1,000,000
0 ≤ número de decoradores ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
Exemplos
Entrada:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
Saída esperada:
expected = 102.2
Entrada:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
Saída esperada:
double expected = 102.2;
Entrada:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
Saída esperada:
double expected = 102.2;
Explicação
100 − 10% = 90, mais 8% de imposto = 97.2, mais 5 de frete = 102.2.
Entrada:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
Saída esperada:
expected = 4.0
Entrada:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
Saída esperada:
double expected = 4.0;
Entrada:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
Saída esperada:
double expected = 4.0;
Explicação
O cupom levaria o preço abaixo de zero, então ele para em 0; depois o frete o leva a 4.
Como abordar
Tente sozinho primeiro e depois abra uma dica de cada vez.
Dica 1
Aplique as camadas exatamente na ordem dada.
Dica 2
As porcentagens são calculadas sobre o preço atual, não sobre o preço base.
Dica 3
Um cupom nunca pode deixar o preço abaixo de 0.
Complexidade esperada
tempo O(número de decoradores), espaço extra O(1)
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.