Problema
El patrón decorator añade comportamiento envolviendo un objeto en capas. Cada capa aquí cambia el precio de la capa interior.
Parte de base_price y aplica los decoradores en orden:
discount p: reduce el precio en p por ciento.tax p: aumenta el precio en p por ciento.shipping a: añade una cantidad fija a.coupon a: resta a, pero nunca baja de 0.
Implementa price_decorators(base_price, decorators).
Entrada
base_price: El precio inicial.
decorators: Las capas, en el orden en que envuelven el precio. Las cantidades pueden tener decimales.
Salida
Devuelve el precio final. Se aceptan respuestas dentro de 1e-6.
Restricciones
0 ≤ base_price ≤ 1,000,000
0 ≤ número de decoradores ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
Ejemplos
Entrada:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
Salida esperada:
expected = 102.2
Entrada:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
Salida esperada:
double expected = 102.2;
Entrada:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
Salida esperada:
double expected = 102.2;
Explicación
100 − 10% = 90, más 8% de impuesto = 97.2, más 5 de envío = 102.2.
Entrada:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
Salida esperada:
expected = 4.0
Entrada:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
Salida esperada:
double expected = 4.0;
Entrada:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
Salida esperada:
double expected = 4.0;
Explicación
El cupón dejaría el precio por debajo de cero, así que se queda en 0; luego el envío lo deja en 4.
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Aplica las capas exactamente en el orden dado.
Pista 2
Los porcentajes se calculan sobre el precio actual, no sobre el precio base.
Pista 3
Un cupón nunca puede dejar el precio por debajo de 0.
Complejidad esperada
tiempo O(número de decoradores), espacio extra O(1)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.