Problema
Il pattern decorator aggiunge comportamento avvolgendo un oggetto in livelli. Ogni livello qui modifica il prezzo del livello interno.
Parti da base_price e applica i decorator in ordine:
discount p: riduce il prezzo di p percento.tax p: aumenta il prezzo di p percento.shipping a: aggiunge un importo fisso a.coupon a: sottrae a, ma senza mai scendere sotto 0.
Implementa price_decorators(base_price, decorators).
Input
base_price: Il prezzo iniziale.
decorators: I livelli, nell’ordine in cui avvolgono il prezzo. Gli importi possono avere decimali.
Output
Restituisci il prezzo finale. Sono accettati risultati entro 1e-6.
Vincoli
0 ≤ base_price ≤ 1,000,000
0 ≤ numero di decoratori ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
Esempi
Input:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
Output atteso:
expected = 102.2
Input:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
Output atteso:
double expected = 102.2;
Input:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
Output atteso:
double expected = 102.2;
Spiegazione
100 − 10% = 90, più 8% di tasse = 97.2, più 5 di spedizione = 102.2.
Input:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
Output atteso:
expected = 4.0
Input:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
Output atteso:
double expected = 4.0;
Input:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
Output atteso:
double expected = 4.0;
Spiegazione
Il coupon porterebbe il prezzo sotto zero, quindi si ferma a 0; poi la spedizione lo porta a 4.
Come affrontarlo
Prova prima da solo, poi apri un suggerimento alla volta.
Suggerimento 1
Applica gli strati esattamente nell'ordine dato.
Suggerimento 2
Le percentuali si calcolano sul prezzo attuale, non sul prezzo base.
Suggerimento 3
Un coupon non può mai portare il prezzo sotto 0.
Complessità attesa
tempo O(numero di decoratori), spazio aggiuntivo O(1)
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.