Voltar para os desafios
Fácil 0 resolvidos 0% de aceitação

Decoradores de preço

Envolva um preço base em decoradores de desconto, imposto, frete e cupom aplicados em ordem.

O que você vai aprender

  • Empilhar comportamentos em camadas em volta de um valor
  • Aplicar porcentagens na ordem certa
  • Impedir que um valor fique abaixo de zero

Problema

Ver original (inglês)

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

Exemplo 1
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.

Exemplo 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.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.