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}]
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"
}
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"}}
# ]
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"}}
# ]
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}}
# ]
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.