Parcours
/
Elixir
Elixir
/
Exercices
/
Suggestions de la boutique
Suggestions de la boutique

Suggestions de la boutique

Exercice d'apprentissage

Introduction

Compréhensions de listes

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}]

Instructions

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"
}

1. Propose une combinaison

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"}}
#    ]

2. Élimine les tenues dont les couleurs jurent

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"}}
#    ]

3. Filtre selon le prix de la combinaison

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}}
#    ]
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elixir Exercism

Prêt à commencer Suggestions de la boutique ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.