Tracks
/
Elixir
Elixir
/
Ejercicios
/
Sugerencias de boutique
Sugerencias de boutique

Sugerencias de boutique

Ejercicio de aprendizaje

Introducción

Comprensiones de listas

Las comprensiones ofrecen un mecanismo para transformar Enumerables de forma fácil y declarativa.

Para declarar una comprensión muy simple, podemos usar la palabra clave for seguida de un generador y un bloque do que crea los nuevos valores a partir de los valores enumerados.

for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]

Las comprensiones también pueden tener filtros. Los valores que no pasan el filtro se eliminan de la lista final:

for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]

Podemos declarar comprensiones más complicadas en varias líneas:

for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
    rem(number, 2) == 0 do
  atom
end

# => [:b, :d]

Se puede crear un producto cartesiano usando varios generadores. Eso significa que cada valor generado por el primer generador se emparejará una vez con cada valor generado por el segundo generador:

for x <- [0, 1],
    y <- [0, 1] do
  {x, y}
end

# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]

Instrucciones

Tu trabajo en la tienda de moda en línea continúa. Se te ocurre la idea de una funcionalidad del sitio web en la que se le sugiere un atuendo al usuario. Aunque quieres dar muchas sugerencias, no quieres dar malas sugerencias, así que decides usar una comprensión de listas, ya que puedes generar combinaciones de atuendos fácilmente y luego filtrarlas por algún criterio.

Las prendas de ropa se almacenan en un mapa:

%{
  item_name: "Descriptive Name",
  price: 99.00,
  color: "Ochre Red",
  base_color: "red"
}

1. Sugiere una combinación

Implementa get_combinations/3 para que reciba una lista de prendas superiores, una lista de prendas inferiores y una lista de palabras clave de opciones. Por ahora, haz que las opciones tengan como valor predeterminado una lista de palabras clave vacía. La función debe devolver el producto cartesiano de las listas.

tops = [
  %{item_name: "Dress shirt"},
  %{item_name: "Casual shirt"}
]

bottoms = [
  %{item_name: "Jeans"},
  %{item_name: "Dress trousers"}
]

BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
#      {%{item_name: "Dress shirt"}, %{item_name: "Jeans"}},
#      {%{item_name: "Dress shirt"}, %{item_name: "Dress trousers"}},
#      {%{item_name: "Casual shirt"}, %{item_name: "Jeans"}},
#      {%{item_name: "Casual shirt"}, %{item_name: "Dress trousers"}}
#    ]

2. Descarta los atuendos que no combinan

Cada prenda tiene un campo :base_color; usa este campo para descartar todas las combinaciones en las que la prenda superior y la inferior tengan el mismo color base.

tops = [
  %{item_name: "Dress shirt", base_color: "blue"},
  %{item_name: "Casual shirt", base_color: "black"}
]

bottoms = [
  %{item_name: "Jeans", base_color: "blue"},
  %{item_name: "Dress trousers", base_color: "black"}
]

BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
#      {%{item_name: "Dress shirt", base_color: "blue"},
#       %{item_name: "Dress trousers", base_color: "black"}},
#      {%{item_name: "Casual shirt", base_color: "black"},
#       %{item_name: "Jeans", base_color: "blue"}}
#    ]

3. Filtra por el precio de la combinación

Cada prenda tiene un campo :price asociado. Aunque quieres dar muchas sugerencias, también quieres darles a los usuarios la oportunidad de elegir un precio dentro de su presupuesto. De la lista de palabras clave de opciones, usa :maximum_price para descartar las combinaciones en las que el precio de la prenda superior y el de la inferior superen el precio máximo.

Si no se especifica un maximum_price, el valor predeterminado debe ser 100.00

tops = [
  %{item_name: "Dress shirt", base_color: "blue", price: 35},
  %{item_name: "Casual shirt", base_color: "black", price: 20}
]

bottoms = [
  %{item_name: "Jeans", base_color: "blue", price: 30},
  %{item_name: "Dress trousers", base_color: "black", price: 75}
]

BoutiqueSuggestions.get_combinations(tops, bottoms, maximum_price: 50)
# => [
#      {%{item_name: "Casual shirt", base_color: "black", price: 20},
#       %{item_name: "Jeans", base_color: "blue", price: 30}}
#    ]
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Sugerencias de boutique?

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