Escala de Receta - FreeCodeCamp Daily Challenge
Introducción
El desafío diario de hoy es el problema “Recipe Scale” de FreeCodeCamp. Lo resolvemos utilizando técnicas como la desestructuración de arrays, manipulación de cadenas y bucles en JavaScript. Exploraremos el enunciado del problema, desarrollaremos una solución paso a paso, analizaremos su complejidad y discutiremos casos especiales.
Enunciado del Problema
Dado un array de ingredientes de una receta y un número para escalar la receta, devuelve un array con las cantidades ajustadas en consecuencia. Cada elemento del array será una cadena con el formato: “cantidad unidad ingrediente”. Por ejemplo: “2 C Harina”.
Escala la cantidad por el número dado, manteniendo el formato original. No incluyas ceros innecesarios ni conviertas las unidades. Devuelve los elementos escalados en el mismo orden en que se proporcionan.
Ejemplo
scaleRecipe(["2 C Flour", "1.5 T Sugar"], 2)debería devolver["4 C Flour", "3 T Sugar"].scaleRecipe(["4 T Flour", "1 C Milk", "2 T Oil"], 1.5)debería devolver["6 T Flour", "1.5 C Milk", "3 T Oil"].scaleRecipe(["3 C Milk", "2 C Oats"], 0.5)debería devolver["1.5 C Milk", "1 C Oats"].scaleRecipe(["2 C All-purpose Flour", "1 t Baking Soda", "1 t Salt", "1 C Butter", "0.5 C Sugar", "0.5 C Brown Sugar", "1 t Vanilla Extract", "2 C Chocolate Chips"], 2.5)debería devolver["5 C All-purpose Flour", "2.5 t Baking Soda", "2.5 t Salt", "2.5 C Butter", "1.25 C Sugar", "1.25 C Brown Sugar", "2.5 t Vanilla Extract", "5 C Chocolate Chips"].
Desarrollo de la Solución
Enfoque
Para resolver este problema, utilizaremos el método map para iterar sobre cada ingrediente del array, dividir la cadena en sus componentes, escalar la cantidad y luego reconstruir la cadena con la nueva cantidad.
Implementación
function scaleRecipe(ingredients, scale) {
return ingredients.map((item) => {
const [quantity, unit, ...ingredientParts] = item.split(' ')
const ingredient = ingredientParts.join(' ')
const scaledQuantity = Number.parseFloat(quantity) * scale
return `${scaledQuantity} ${unit} ${ingredient}`
})
}Explicación del Código
- Desestructuración: Dividimos cada cadena en
cantidad,unidady el resto de la descripción del ingrediente. - Escalado: Multiplicamos la cantidad por el factor de escala proporcionado.
- Reconstrucción: Combinamos los valores escalados con las unidades y el nombre del ingrediente para mantener el formato original.
Complejidad
Complejidad Temporal
La complejidad temporal de esta solución es (O(n)), donde (n) es el número de ingredientes en la receta. Esto se debe a que usamos el método map para iterar una vez sobre el array, realizando operaciones constantes para cada elemento.
Complejidad Espacial
La complejidad espacial es (O(n)), ya que estamos creando un nuevo array para almacenar los ingredientes escalados. Cada elemento del array original se transforma en un nuevo elemento en el array resultante.
Reflexiones y Aprendizajes
Conceptos Aplicados
- Manipulación de cadenas: Uso de
split,joiny template literals. - Estructuras de datos: Uso de arrays para almacenar y modificar los ingredientes.
- Funciones de orden superior: Uso de
mappara transformar arrays de manera concisa. - Desestructuración de arrays: Extracción de múltiples valores de un array en una sola declaración.
- Manejo de números: Conversión de cadenas a números y operaciones aritméticas para escalar cantidades.
- Mantenimiento del formato: Asegurar que la salida mantenga el formato original de los ingredientes.
- Uso de métodos modernos de JavaScript: Aplicación de ES6+ para escribir código más limpio y eficiente.