Rutas
/
Elixir
Elixir
/
Ejercicios
/
Inventario de la boutique
Inventario de la boutique

Inventario de la boutique

Ejercicio de aprendizaje

Introducción

Enum

Enum es un módulo muy útil que ofrece un conjunto de algoritmos para trabajar con enumerables. Ofrece ordenación, filtrado, agrupación, conteo, búsqueda, búsqueda de valores mínimos y máximos, y mucho más.

En general, un enumerable es cualquier dato sobre el que se pueda iterar, una colección. En Elixir, un enumerable es cualquier tipo de dato que implemente el protocolo Enumerable. Los más comunes son las listas y los mapas.

Muchas funciones de Enum aceptan una función como argumento.

Enum.all?([1, 2, 3, 4, 5], fn x -> x > 3 end)
# => false

Las funciones de Enum más comunes son map y reduce.

map/2

Enum.map/2 te permite sustituir cada elemento de un enumerable por otro elemento. El segundo argumento de Enum.map/2 es una función que acepta el elemento original y devuelve su sustituto.

reduce/3

Enum.reduce/3 te permite reducir todo el enumerable a un único valor. Para lograrlo, se usa una variable especial llamada acumulador. El acumulador transporta el estado intermedio de la reducción entre iteraciones.

El segundo argumento de Enum.reduce/3 es el valor inicial del acumulador. El tercer argumento es una función que acepta un elemento y un acumulador, y devuelve el nuevo valor del acumulador.

Trabajar con mapas

Cuando usas mapas con funciones de Enum, el mapa se convierte automáticamente en una lista de 2 tuplas {key, value}.

Para volver a transformarlo en un mapa, usa Enum.into/2. Enum.into/2 es una función que transforma un enumerable en un coleccionable, es decir, cualquier estructura de datos que implemente el protocolo Collectable. Se puede considerar lo contrario de Enum.reduce/3.

Enum también tiene Enum.into/3. Enum.into/3 es una variación de Enum.into/2 que acepta una función de transformación que se aplica mientras se transforma el enumerable en un coleccionable.

Transformar mapas

En lugar de usar Enum.into/3 o Enum.map/2 junto con Enum.into/2 para aplicar una transformación (un mapeo) a un mapa, también podemos usar una función dedicada: Map.new/2. Funciona exactamente igual que Enum.into/3 en el sentido de que acepta un enumerable y una función de transformación, pero siempre devuelve un mapa nuevo en lugar de dejarnos elegir el coleccionable.

Instrucciones

Llevas una boutique de moda online. Tu gran periodo de rebajas anual está a punto de empezar, así que tienes que hacer inventario para asegurarte de que tienes todo preparado.

Cada artículo del inventario se representa con un map, y el inventario completo es un array de esos maps.

%{
  name: "White Shirt",
  price: 40,
  quantity_by_size: %{s: 3, m: 7, l: 8, xl: 4}
}

1. Ordena los artículos por precio

Implementa la función sort_by_price/1. Debe recibir el inventario y devolverlo ordenado por el precio del artículo, en orden ascendente.

BoutiqueInventory.sort_by_price([
  %{price: 65, name: "Maxi Brown Dress", quantity_by_size: %{}},
  %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
  %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
  %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}}
])

# => [
#      %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}},
#      %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
#      %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
#      %{price: 65, name: "Maxi Brown Dress", price: 65, quantity_by_size: %{}}
#    ]

2. Encuentra todos los artículos a los que les falta el precio

Después de ordenar tu inventario por precio, te diste cuenta de que debiste cometer un error al hacer el inventario y te olvidaste de rellenar el precio de algunos artículos.

Implementa la función with_missing_price/1. Debe recibir el inventario y devolver un array de artículos que no tienen precio.

BoutiqueInventory.with_missing_price([
  %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
  %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
  %{price: nil, name: "Denim Skirt", quantity_by_size: %{}},
  %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
])

# => [
#      %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: nil, name: "Denim Skirt", quantity_by_size: %{}}
#    ]

3. Actualiza los nombres de los artículos

Te has dado cuenta de que en el nombre de algunos artículos aparece una palabra que ya no te gusta usar. Ahora tienes que actualizar todos los nombres de artículos que contengan esa palabra.

Implementa la función update_names/3. Debe recibir el inventario, la palabra antigua que quieres eliminar y una palabra nueva que quieres usar en su lugar. Debe devolver un array de artículos con los nombres actualizados.

BoutiqueInventory.update_names(
  [
    %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
    %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
    %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
    %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
  ],
  "T-shirt",
  "Tee"
)

# => [
#      %{price: 40, name: "Black Tee", quantity_by_size: %{}},
#      %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
#      %{price: 40, name: "Orange Tee", quantity_by_size: %{}}
#    ]

4. Incrementa la cantidad del artículo

Algunos artículos se vendían especialmente bien, así que pediste más, de todas las tallas.

Implementa la función increase_quantity/2. Debe recibir un único artículo y un número n, y devolver ese artículo con la cantidad de cada talla incrementada en n.

BoutiqueInventory.increase_quantity(
  %{
    name: "Polka Dot Skirt",
    price: 68,
    quantity_by_size: %{s: 3, m: 5, l: 3, xl: 4}
  },
  6
)

# => %{
#      name: "Polka Dot Skirt",
#      price: 68,
#      quantity_by_size: %{l: 9, m: 11, s: 9, xl: 10}
#    }

5. Calcula la cantidad total del artículo

Para saber cuánto espacio necesitas en tu almacén, tienes que saber cuántas unidades tienes en total de cada artículo.

Implementa la función total_quantity/1. Debe recibir un único artículo y devolver cuántas piezas tienes en total, de cualquier talla.

BoutiqueInventory.total_quantity(%{
  name: "Red Shirt",
  price: 62,
  quantity_by_size: %{s: 3, m: 6, l: 5, xl: 2}
})

# => 16
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Inventario de la boutique?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.