Dia 12: Precio de árboles de Navidad
Estás en un mercado muy especial en el que se venden árboles de Navidad 🎄. Cada uno viene decorado con una serie de adornos muy peculiares, y el precio del árbol se determina en función de los adornos que tiene.
*: Copo de nieve - Valor: 1
o: Bola de Navidad - Valor: 5
^: Arbolito decorativo - Valor: 10
#: Guirnalda brillante - Valor: 50
@: Estrella polar - Valor: 100
Normalmente se sumarían todos los valores de los adornos y ya está…
Pero, ¡ojo! Si un adorno se encuentra inmediatamente a la izquierda de otro de mayor valor, en lugar de sumar, se resta su valor.
calculatePrice('***') // 3 (1 + 1 + 1)
calculatePrice('*o') // 4 (5 - 1)
calculatePrice('o*') // 6 (5 + 1)
calculatePrice('*o*') // 5 (-1 + 5 + 1)
calculatePrice('**o*') // 6 (1 - 1 + 5 + 1)
calculatePrice('o***') // 8 (5 + 3)
calculatePrice('*o@') // 94 (-5 - 1 + 100)
calculatePrice('*#') // 49 (-1 + 50)
calculatePrice('@@@') // 300 (100 + 100 + 100)
calculatePrice('#@') // 50 (-50 + 100)
calculatePrice('#@Z') // undefined (Z es desconocido)
Solution
function calculatePrice(ornaments) {
const values = {
'*': 1, // Copo de nieve
'o': 5, // Bola de Navidad
'^': 10, // Arbolito decorativo
'#': 50, // Guirnalda brillante
'@': 100 // Estrella polar
}
let total = 0
for (let i = 0; i < ornaments.length; i++) {
const current = ornaments[i]
const next = ornaments[i + 1]
if (!Object.hasOwn(values, current)) return undefined
if (next && values[current] < values[next]) total -= values[current]
else total += values[current]
}
return total
}
calculatePrice('*o^#@')