Les compréhensions offrent un moyen de transformer des Enumerables facilement et de façon déclarative.
Pour déclarer une compréhension très simple, on peut utiliser le mot-clé for suivi d'un générateur et d'un bloc do qui crée les nouvelles valeurs à partir des valeurs énumérées.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
Les compréhensions peuvent aussi avoir des filtres. Les valeurs qui ne passent pas le filtre sont retirées de la liste finale :
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
On peut déclarer des compréhensions plus compliquées sur plusieurs lignes :
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
On peut créer un produit cartésien en utilisant plusieurs générateurs. Cela signifie que chaque valeur générée par le premier générateur sera associée une fois à chaque valeur générée par le second générateur :
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Ton travail dans la boutique de mode en ligne se poursuit. Tu as l'idée d'une fonctionnalité du site qui suggère une tenue à l'utilisateur. Tu veux donner beaucoup de suggestions, mais tu ne veux pas en donner de mauvaises ; tu décides donc d'utiliser une compréhension de liste, car on peut facilement générer des combinaisons de tenues, puis les filtrer selon certains critères.
Les vêtements sont stockés dans une map :
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Implémente get_combinations/3, qui prend une liste de hauts, une liste de bas et une liste de mots-clés d'options. Pour l'instant, fais en sorte que les options valent par défaut une liste de mots-clés vide. La fonction doit renvoyer le produit cartésien des listes.
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"}}
# ]
Chaque vêtement possède un champ :base_color ; utilise ce champ pour éliminer toutes les combinaisons où le haut et le bas ont la même couleur de 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"}}
# ]
Chaque vêtement possède un champ :price qui lui est associé. Tu veux donner beaucoup de suggestions, mais tu veux aussi pouvoir offrir aux utilisateurs la possibilité de choisir un prix correspondant à leur budget. Dans la liste de mots-clés d'options, utilise :maximum_price pour éliminer les combinaisons où le prix du haut et du bas dépasse le prix maximum.
Si aucun maximum_price n'est précisé, la valeur par défaut doit être 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}}
# ]
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.