Viajero Comprador - FreeCodeCamp #134 Daily Challenge
2 min
🛒 Enunciado resumido
Dado un monto inicial y una lista de ítems a comprar (ambos en formato ["Cantidad", "Moneda"]), ¿cuántos podés comprar en orden, usando la siguiente tabla de conversión?
| Moneda | Equivalente en USD |
|---|---|
| USD | 1.00 USD |
| EUR | 1.10 USD |
| GBP | 1.25 USD |
| JPY | 0.0070 USD |
| CAD | 0.75 USD |
- Si alcanza para todos, devolvé “Buy them all!”
- Si no, devolvé “Buy the first x items” (x = cantidad de ítems que podés comprar en orden).
🔎 Análisis y estrategia
El truco está en convertir todo a USD antes de comparar. Así evitamos errores y simplificamos el cálculo. El proceso es:
- Convertir el monto inicial a USD.
- Recorrer la lista de ítems, convirtiendo cada precio a USD.
- Simular la compra secuencial: si alcanza, resto; si no, corto y devuelvo cuántos pude comprar.
¿Por qué no convertir a la moneda original? Porque todas las tasas están dadas respecto a USD, y convertir todo a una sola moneda es más directo y menos propenso a errores de redondeo.
🧪 Casos de prueba clave
- El monto alcanza para algunos, pero no todos los ítems → debe devolver la cantidad máxima posible.
- El monto alcanza justo para todos → “Buy them all!”
- Monto e ítems en monedas mezcladas → debe convertir bien.
- Monedas menos comunes (JPY, CAD) → robustez.
- El monto no alcanza ni para el primero → “Buy the first 0 items.”
- Sobra dinero después de comprar todo → igual, “Buy them all!”
💡 Implementación comentada
const rates = {
USD: 1.0,
EUR: 1.1,
GBP: 1.25,
JPY: 0.007,
CAD: 0.75,
}
export default function buyItems(amount, items) {
// Convertir monto inicial a USD
let budget = Number.parseFloat(amount[0]) * rates[amount[1]]
let count = 0
for (const [price, currency] of items) {
const priceUSD = Number.parseFloat(price) * rates[currency]
if (budget >= priceUSD) {
budget -= priceUSD
count++
}
else {
return `Buy the first ${count} items.`
}
}
return 'Buy them all!'
}⏱️ Complejidad
- Tiempo: (recorre la lista una vez)
- Espacio: (no usa estructuras proporcionales al input)
⚠️ Edge cases y tips
- Si no alcanza ni para el primero → “Buy the first 0 items.”
- Si alcanza justo o sobra → “Buy them all!”
- Siempre convertir a USD antes de comparar.
- Usar
parseFloatpara manejar decimales y enteros.
🤔 Reflexiones y aprendizajes
- Destructuring para arrays.
- Conversión de monedas con tabla fija.
- Simulación greedy secuencial.
- Código simple, claro y óptimo para el caso.