Tracks
/
Elixir
Elixir
/
Ejercicios
/
Inventario de boutique
Inventario de boutique

Inventario de 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 ordenar, filtrar, agrupar, contar, buscar, encontrar valores mínimos y máximos, y mucho más.

En general, un enumerable es cualquier dato 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 de esos 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 reemplazar cada elemento de un enumerable por otro elemento. El segundo argumento de Enum.map/2 es una función que recibe el elemento original y devuelve su reemplazo.

reduce/3

Enum.reduce/3 te permite reducir todo el enumerable a un solo valor. Para lograrlo, se usa una variable especial llamada acumulador. El acumulador lleva 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 recibe un elemento y un acumulador, y devuelve el nuevo valor del acumulador.

Trabajar con mapas

Cuando usas mapas con las 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 collectable, es decir, cualquier estructura de datos que implemente el protocolo Collectable. Se puede pensar en ella como lo opuesto a 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 transforma el enumerable en un collectable.

Mapear mapas

En lugar de usar Enum.into/3 o Enum.map/2 más Enum.into/2 para aplicar una transformación (mapeo) a un mapa, también podemos usar una función dedicada, Map.new/2. Funciona exactamente como Enum.into/3, ya que acepta un enumerable y una función de transformación, pero siempre devuelve un mapa nuevo en lugar de dejarnos elegir un collectable.

Instrucciones

Estás al frente de una boutique de moda en línea. Se acerca tu gran venta anual, así que necesitas hacer el inventario para asegurarte de que todo esté listo.

Cada artículo del inventario se representa con un mapa, y todo el inventario es una lista de esos mapas.

%{
  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 de los artículos, de forma 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, notaste que debiste cometer un error cuando estabas haciendo el inventario y olvidaste anotar los precios de algunos artículos.

Implementa la función with_missing_price/1. Debe recibir el inventario y devolver una lista de los 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

Notaste que algunos nombres de artículos contienen una palabra que ya no quieres usar. Ahora necesitas actualizar todos los nombres de artículos que tengan esa palabra.

Implementa la función update_names/3. Debe recibir el inventario, la palabra antigua que quieres quitar y una palabra nueva que quieres usar en su lugar. Debe devolver una lista 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. Aumenta la cantidad del artículo

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

Implementa la función increase_quantity/2. Debe recibir un solo artículo y un número n, y devolver ese artículo con la cantidad de cada talla aumentada 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, necesitas saber cuántas unidades tienes en total de cada artículo.

Implementa la función total_quantity/1. Debe recibir un solo artículo y devolver cuántas piezas tienes en total, en 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 una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Inventario de boutique?

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