Parcours
/
Elixir
Elixir
/
Exercices
/
Cave à vin
Cave à vin

Cave à vin

Exercice d'apprentissage

Introduction

Listes de mots-clés

Les listes de mots-clés sont une structure de données clé-valeur.

[month: "April", year: 2018]

Les listes de mots-clés sont des listes de tuples {key, value}, que l'on peut aussi écrire sous cette forme, même si la syntaxe plus courte est la plus répandue.

[month: "April"] == [{:month, "April"}]
# => true

Les clés d'une liste de mots-clés doivent être des atomes, mais les valeurs peuvent être de n'importe quel type. Une même clé peut être utilisée plusieurs fois. Les paires clé-valeur d'une liste de mots-clés sont ordonnées.

On peut manipuler les listes de mots-clés de la même manière que les listes, ou bien utiliser le module Keyword.

Instructions

Tu es le gérant d'un restaurant chic doté d'une belle cave à vins. Beaucoup de tes clients sont des passionnés de vin exigeants. Trouver la bonne bouteille de vin pour un client donné n'est pas une tâche facile.

En bon restaurateur féru de technologie, tu as décidé d'accélérer le processus de sélection des vins en écrivant une application qui permettra à tes clients de filtrer tes vins selon leurs préférences.

1. Explique les couleurs de vin

Sur l'écran d'accueil de ton application, tu veux afficher une brève explication de chaque couleur de vin.

Implémente la fonction WineCellar.explain_colors/0. Elle ne prend aucun argument et renvoie une keyword list ayant les couleurs de vin comme clés et les explications comme valeurs.

Couleur Explication
:white Fermenté sans contact avec les peaux.
:red Fermenté au contact des peaux, à partir de raisins à peau foncée.
:rose Fermenté avec un peu de contact avec les peaux, mais pas assez pour être considéré comme un vin rouge.

2. Récupère tous les vins d'une couleur donnée

Une bouteille de vin est représentée par un tuple de trois éléments : le cépage, l'année et le pays d'origine. Les vins sont stockés par couleur de vin dans une keyword list.

[
  white: {"Chardonnay", 2015, "Italy"},
  white: {"Pinot grigio", 2017, "Germany"},
  red: {"Pinot noir", 2016, "France"},
  rose: {"Dornfelder", 2018, "Germany"}
]

Implémente la fonction WineCellar.filter/3. Elle doit prendre une keyword list de vins, un atome de couleur et une keyword list d'options, avec une valeur par défaut de []. La fonction doit renvoyer la liste des vins d'une couleur donnée.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white
)

# => [
#      {"Chardonnay", 2015, "Italy"},
#      {"Pinot grigio", 2017, "Germany"}
#    ]

3. Récupère tous les vins d'une couleur donnée mis en bouteille une année donnée

Étends la fonction WineCellar.filter/3. Lorsqu'on lui passe une option :year, la fonction doit renvoyer la liste des vins d'une couleur donnée provenant d'une année donnée.

Utilise la fonction WineCellar.filter_by_year/2, déjà implémentée. Elle prend une liste de vins et une année en arguments et renvoie la liste des vins d'une année donnée.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015
)

# => [
#      {"Chardonnay", 2015, "Italy"}
#    ]

4. Récupère tous les vins d'une couleur donnée mis en bouteille dans un pays donné

Étends la fonction WineCellar.filter/3. Lorsqu'on lui passe une option :country, la fonction doit renvoyer la liste des vins d'une couleur donnée provenant d'un pays donné.

Utilise la fonction WineCellar.filter_by_country/2, déjà implémentée. Elle prend une liste de vins et un pays en arguments et renvoie la liste des vins d'un pays donné.

Vérifie que la fonction fonctionne lorsqu'on lui passe à la fois l'option :year et l'option :country, dans n'importe quel ordre.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015,
  country: "Germany"
)

# => []
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elixir Exercism

Prêt à commencer Cave à vin ?

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