Combustible Para Despegue - FreeCodeCamp #141 Daily Challenge
Enunciado del Problema
Dado el número de galones de combustible que actualmente tiene tu avión, y el número requerido de litros de combustible para llegar a destino, determina cuántos galones adicionales necesitas agregar para completar el viaje.
- 1 galón = 3.78541 litros
- Si el avión ya tiene suficiente combustible, retorna 0.
- Solo puedes agregar combustible en galones enteros.
- No incluyas decimales en la respuesta.
Análisis Inicial
Comprensión del Problema
El objetivo es determinar la cantidad mínima de galones enteros de combustible que debemos añadir a un avión para completar un trayecto. El problema nos proporciona el combustible actual en galones y el combustible necesario en litros, lo que implica una conversión inicial utilizando la tasa de .
Debemos considerar tres condiciones clave:
- Suficiencia: Si el combustible actual ya cubre los litros requeridos, el resultado debe ser
0. - Unidades de carga: Solo se pueden agregar galones completos (números enteros).
- Redondeo: Si falta combustible, cualquier fracción de galón necesaria obliga a cargar el galón completo siguiente (redondeo hacia arriba o ceiling), asegurando que nunca falte combustible por decimales.
Casos de Prueba Identificados
- Sin combustible inicial:
fuelToAdd(0, 1)retorna1. Aunque se requiere una cantidad mínima de litros, al no tener combustible y solo poder cargar galones enteros, el mínimo a añadir es 1. - Combustible insuficiente (con decimales):
fuelToAdd(5, 40)retorna6. 40 litros equivalen a galones. Como ya tenemos 5, faltan , lo que obliga a cargar 6 galones enteros para cubrir el excedente. - Combustible suficiente:
fuelToAdd(10, 30)retorna0. 30 litros equivalen a galones. Al tener 10 galones, el avión ya supera el requerimiento, por lo que no se añade nada. - Grandes volúmenes:
fuelToAdd(896, 20500)retorna4520yfuelToAdd(1000, 50000)retorna12209. Estos casos validan que la lógica de conversión y redondeo sea precisa incluso con cantidades elevadas de combustible.
Desarrollo de la Solución
Enfoque Elegido
Para resolver este problema, utilizaremos un enfoque puramente matemático y secuencial. La estrategia se basa en la unificación de magnitudes y el redondeo hacia el techo (ceiling).
flowchart TD
Start(["Inicio"]) --> Input["Entrada: currentGallons, requiredLiters"]
Input --> Convert["Convertir requiredLiters a galones<br/>(litros / 3.78541)"]
Convert --> Diff["Calcular diferencia:<br/>needed = requiredGallons - currentGallons"]
Diff --> Check{¿needed > 0?}
Check -- No --> Zero["Retornar 0"]
Check -- Sí --> Ceil["Retornar Math.ceil(needed)"]
Zero --> End(["Fin"])
Ceil --> End
La lógica sigue estos pasos:
- Normalización: Convertir el requerimiento de litros a galones para poder compararlo directamente con el combustible actual.
- Cálculo de la brecha: Determinar la diferencia entre lo necesario y lo que ya se tiene.
- Ajuste a restricciones: Si falta combustible, redondear el resultado al entero superior para cumplir con la regla de “solo galones enteros”.
Implementación Paso a Paso
- Definir la constante de conversión: Establecer .
- Calcular galones requeridos: Dividir
requiredLiterspor la constante de conversión. - Calcular el faltante: Restar
currentGallonsal valor obtenido en el paso anterior. - Retornar el resultado:
- Si el faltante es menor o igual a 0, retornar
0. - Si es mayor a 0, retornar
Math.ceil(faltante)para asegurar que cubrimos el requerimiento con unidades enteras.
- Si el faltante es menor o igual a 0, retornar
Código Completo
function fuelToAdd(currentGallons, requiredLiters) {
const LITERS_PER_GALLON = 3.78541
const requiredGallons = requiredLiters / LITERS_PER_GALLON
const needed = requiredGallons - currentGallons
return needed <= 0 ? 0 : Math.ceil(needed)
}Análisis de Complejidad
Complejidad Temporal
La complejidad temporal es (tiempo constante). La función realiza un número fijo de operaciones aritméticas (división, resta) y una comparación lógica, independientemente de la magnitud de los valores de entrada. El tiempo de ejecución no escala con el tamaño de los datos.
Complejidad Espacial
La complejidad espacial es (espacio constante). Solo utilizamos una cantidad mínima de memoria para almacenar constantes y variables intermedias (LITERS_PER_GALLON, requiredGallons, needed), las cuales no dependen de ninguna estructura de datos dinámica.
Casos Edge y Consideraciones
- Combustible exacto: Si el combustible actual es exactamente igual al requerido tras la conversión, la diferencia será
0y la función retornará0correctamente. - Entradas en cero: Si
requiredLiterses0, el resultado será0(o negativo si ya hay combustible), manejando correctamente la ausencia de necesidad de carga. - Precisión de punto flotante: Al trabajar con una constante de conversión de 5 decimales (), JavaScript maneja la precisión necesaria para que
Math.ceilactúe correctamente sobre el remanente decimal más pequeño.
Reflexiones y Aprendizajes
Conceptos Aplicados
- Conversión de Unidades: Aplicación de factores de conversión para normalizar datos antes de operar.
- Lógica de Redondeo: Uso de
Math.ceil()para satisfacer requisitos de negocio donde “cualquier fracción cuenta como una unidad entera adicional”. - Programación Defensiva: El uso del operador ternario o condicional para asegurar que nunca se retorne un número negativo de galones a añadir.
Posibles Optimizaciones
Dado que la solución actual ya opera en tiempo y espacio constante (), no existen optimizaciones de rendimiento significativas. La legibilidad es el factor clave aquí, por lo que mantener la constante de conversión clara y los pasos intermedios bien definidos es la mejor práctica.