Parcours
/
Julia
Julia
/
Exercices
/
Serveur traiteur
Serveur traiteur

Serveur traiteur

Exercice d'apprentissage

Introduction

Un Set est une collection d'éléments qui présente les propriétés suivantes :

  • Elle n'est pas ordonnée.
  • Les éléments sont uniques, donc les tentatives d'ajouter des doublons sont silencieusement ignorées.
  • Elle prend en charge une grande partie des opérations courantes sur les ensembles mathématiques.

Crée-les avec le constructeur Set(), en passant n'importe quel itérateur comme paramètre.

julia> s1 = Set(1:4)
Set([4, 2, 3, 1])

Ajoute de nouveaux éléments avec push!() (comme pour les tableaux) et supprime-les avec delete!().

julia> push!(s1, 5)
Set([5, 4, 2, 3, 1])

# Duplicates are ignored
julia> push!(s1, 3)
Set([5, 4, 2, 3, 1])

julia> delete!(s1, 5)
Set([4, 2, 3, 1])

julia> length(s1)  # length counts entries, despite the non-sequential type
4

Opérations sur les ensembles

Comme pour plusieurs autres types de collections, tu peux vérifier l'appartenance avec l'opérateur in ou ∈ (tape \in puis tabulation pour obtenir le symbole).

julia> 3 ∈ s1
true

Les opérations suivantes sur des paires d'ensembles sont prises en charge (les raccourcis vers le symbole de l'opérateur sont indiqués entre parenthèses).

  • union(A, B) ou A ∪ B (\cup) : tous les éléments de A ou de B, ou des deux.
  • intersect(A, B) ou A ∩ B (\cap) : tous les éléments communs à A et à B.
  • setdiff(A, B) (aucun symbole) : les éléments de A qui ne sont pas dans B.
  • symdiff(A, B) (aucun symbole) : les éléments qui sont dans A ou dans B, mais pas dans les deux.
  • issubset(A, B) ou A ⊆ B (\subseteq) ou B ⊇ A (\supseteq) : true si tous les éléments de A sont aussi dans B.
  • issetequal(A, B) (aucun symbole) : true si A et B contiennent exactement les mêmes éléments.
  • isdisjoint(A, B) (aucun symbole) : true si A et B n'ont aucun élément en commun (l'intersection est donc vide).
julia> s1 = Set(1:4);
julia> s2 = Set(3:6);
julia> s1 ∪ s2  # union
Set([5, 4, 6, 2, 3, 1])

julia> s1 ∩ s2  # intersect
Set([4, 3])
  
julia> setdiff(s1, s2)
Set([2, 1])

julia> symdiff(s1, s2)
Set([5, 6, 2, 1])
  
julia> s1 ⊇ s2  # issubset
false

Il existe aussi des versions mutantes de beaucoup d'entre elles, avec un ! ajouté au nom de la fonction. Consulte le manuel pour obtenir la liste complète des fonctions.

Instructions

Avec tes associés, tu diriges une petite entreprise de traiteur. Tu viens d'accepter d'organiser un événement pour un club de cuisine local qui met à l'honneur les plats « favoris du club ». Le club manque d'expérience dans l'organisation de grands événements et a besoin d'aide pour l'organisation, les courses, la préparation et le service. Tu as décidé d'écrire quelques petites fonctions Julia pour accélérer tout le processus de planification.

1. Nettoie les ingrédients des plats

Les recettes de l'événement proviennent de sources variées et leurs ingrédients semblent comporter des entrées en double (voire plus) : tu ne veux quand même pas finir par acheter des articles en trop ! Avant de commencer les courses et la cuisine, la liste d'ingrédients de chaque plat doit être « nettoyée ».

Implémente la fonction clean_ingredients(dish_name, dish_ingredients) qui prend le nom d'un plat et un Vector d'ingrédients. Cette fonction doit renvoyer un Tuple dont le premier élément est le nom du plat, suivi du Set des ingrédients sans doublons.

julia> clean_ingredients("Punjabi-Style Chole", ["onions", "tomatoes", "ginger paste", "garlic paste", "ginger paste", "vegetable oil", "bay leaves", "cloves", "cardamom", "cilantro", "peppercorns", "cumin powder", "chickpeas", "coriander powder", "red chili powder", "ground turmeric", "garam masala", "chickpeas", "ginger", "cilantro"])
("Punjabi-Style Chole", Set(["garam masala", "bay leaves", "ground turmeric", "ginger", "garlic paste", "peppercorns", "ginger paste", "red chili powder", "cardamom", "chickpeas", "cumin powder", "vegetable oil", "tomatoes", "coriander powder", "onions", "cilantro", "cloves"]))

2. Cocktails et mocktails

L'événement proposera à la fois des cocktails et des « mocktails », des boissons mélangées sans alcool. Tu dois t'assurer que les boissons « mocktail » sont vraiment sans alcool et que les cocktails contiennent bel et bien de l'alcool.

Implémente la fonction check_drinks(drink_name, drink_ingredients) qui prend le nom d'une boisson et un Vector d'ingrédients. La fonction doit renvoyer le nom de la boisson suivi de "Mocktail" si la boisson ne contient aucun ingrédient alcoolisé, et le nom de la boisson suivi de "Cocktail" si la boisson contient de l'alcool. Pour les besoins de cet exercice, les cocktails ne contiendront que les alcools de la constante ALCOHOLS :

julia> check_drinks("Honeydew Cucumber", ["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])
"Honeydew Cucumber Mocktail"

julia> check_drinks("Shirley Tonic", ["cinnamon stick", "scotch", "whole cloves", "ginger", "pomegranate juice", "sugar", "club soda"])
"Shirley Tonic Cocktail"

3. Classe les plats

La liste des invités comprend des convives aux besoins alimentaires variés, et ton personnel devra répartir les plats en Vegan, Vegetarian, Paleo, Keto et Omnivore.

Implémente la fonction categorize_dish(dish_name, dish_ingredients) qui prend le nom d'un plat et un set des ingrédients de ce plat. La fonction doit renvoyer une String sous la forme dish name: CATEGORY (la catégorie à laquelle appartient le plat). Tous les plats « rentrent » dans l'une des catégories : VEGAN, VEGETARIAN, PALEO, KETO ou OMNIVORE.

julia> categorize_dish("Sticky Lemon Tofu", Set(["tofu", "soy sauce", "salt", "black pepper", "cornstarch", "vegetable oil", "garlic", "ginger", "water", "vegetable stock", "lemon juice", "lemon zest", "sugar"]))
"Sticky Lemon Tofu: VEGAN"

julia> categorize_dish("Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole", Set(["shrimp", "bacon", "avocado", "chickpeas", "fresh tortillas", "sea salt", "guajillo chile", "slivered almonds", "olive oil", "butter", "black pepper", "garlic", "onion"]))
"Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole: OMNIVORE"

4. Étiquette les allergènes et les aliments soumis à restriction

Certains invités ont des allergies et des restrictions alimentaires supplémentaires. Ces ingrédients doivent être étiquetés ou annotés pour chaque plat afin d'éviter tout problème.

Implémente la fonction tag_special_ingredients(dish) qui prend un Tuple dont la première position contient le nom du plat et la seconde un Vector ou un Set des ingrédients de ce plat. Renvoie le nom du plat suivi du Set des ingrédients qui nécessitent une mention spéciale dans la description du plat. Les ingrédients d'un plat dans un Vector peuvent contenir ou non des doublons. Pour les besoins de cet exercice, tous les allergènes et ingrédients spéciaux à étiqueter figurent dans la constante SPECIAL_INGREDIENTS.

julia> tag_special_ingredients(("Ginger Glazed Tofu Cutlets", ["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]))
("Ginger Glazed Tofu Cutlets", Set(["garlic","soy sauce","tofu"]))

julia> tag_special_ingredients(("Arugula and Roasted Pork Salad", ["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts", "balsamic vinegar", "onions", "black pepper"
]))
("Arugula and Roasted Pork Salad", Set(["pork tenderloin", "blue cheese", "pine nuts", "onions"]))

5. Compile une « liste maîtresse » d'ingrédients

Pour préparer les commandes et les courses, tu devras compiler une « liste maîtresse » des ingrédients de tout ce qui figure au menu (les quantités seront précisées plus tard).

Implémente la fonction compile_ingredients(dishes) qui prend un Vector de plats et renvoie un ensemble de tous les ingrédients de l'ensemble des plats listés. Chaque plat est représenté par son Set d'ingrédients.

julia> dishes = [Set(["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]), Set(["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts","balsamic vinegar", "onions", "black pepper"]), Set(["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])];

julia> compile_ingredients(dishes)
Set(["arugula", "brown sugar", "honeydew", "coconut water", "english cucumber", "balsamic vinegar", "mint leaves", "pears", "pork tenderloin", "ginger", "blue cheese", "soy sauce", "sesame seeds", "black pepper", "garlic", "lime juice", "corn starch", "pine nuts", "lemon juice", "onions", "salt", "tofu"])

6. Sors les amuse-bouches à servir sur des plateaux

Les hôtes t'ont donné une liste de plats qu'ils aimeraient voir préparés en petites bouchées, à servir sur des plateaux. Tu dois les retirer de la liste principale des plats préparés en portions plus grandes.

Implémente la fonction separate_appetizers(dishes, appetizers) qui prend un Vector de noms de plats et un Vector de noms d'amuse-bouches. La fonction doit renvoyer un Vector contenant la liste des noms de plats, sans les noms d'amuse-bouches. Le Vector dishes ou appetizers peut contenir des doublons et nécessiter une déduplication.

julia> dishes = ["Avocado Deviled Eggs","Flank Steak with Chimichurri and Asparagus", "Kingfish Lettuce Cups", "Grilled Flank Steak with Caesar Salad","Vegetarian Khoresh Bademjan","Avocado Deviled Eggs", "Barley Risotto","Kingfish Lettuce Cups"];
          
julia> appetizers = ["Kingfish Lettuce Cups","Avocado Deviled Eggs","Satay Steak Skewers", "Dahi Puri with Black Chickpeas","Avocado Deviled Eggs","Asparagus Puffs", "Asparagus Puffs"];
              
julia> separate_appetizers(dishes, appetizers)
["Vegetarian Khoresh Bademjan", "Barley Risotto", "Flank Steak with Chimichurri and Asparagus", "Grilled Flank Steak with Caesar Salad"]

7. Trouve les ingrédients utilisés dans une seule recette

Dans chaque catégorie (VEGAN, VEGETARIAN, PALEO, KETO ou OMNIVORE), tu vas extraire les ingrédients qui n'apparaissent que dans un seul plat. Ces ingrédients « uniques » seront confiés à une personne dédiée aux courses pour qu'on ne les oublie pas dans la précipitation à tout terminer.

Implémente la fonction singleton_ingredients(dishes, intersection) qui prend un Vector de plats et une constante CATEGORY_INTERSECTION pour la même catégorie. Chaque plat est représenté par un Set de ses ingrédients. Chaque CATEGORY_INTERSECTION est un Set d'ingrédients qui apparaissent dans plus d'un plat de la catégorie. À l'aide d'opérations sur les ensembles, ta fonction doit renvoyer un Set d'ingrédients « uniques » (ingrédients qui n'apparaissent que dans un seul plat de la catégorie).

julia> singleton_ingredients(example_dishes, EXAMPLE_INTERSECTION)
Set(["garlic powder", "sunflower oil", "mixed herbs", "cornstarch", "celeriac", "honey", "mushrooms", "bell pepper", "rosemary", "parsley", "lemon", "yeast", "vegetable oil", "vegetable stock", "silken tofu", "tofu", "cashews", "lemon zest", "smoked tofu", "spaghetti", "ginger", "breadcrumbs", "tomatoes", "barley malt", "red pepper flakes", "oregano", "red onion", "fresh basil"])
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Julia Exercism

Prêt à commencer Serveur traiteur ?

Inscris-toi sur Exercism pour apprendre et maîtriser Julia avec 35 concepts128 exercices, et un vrai mentorat humain, le tout gratuitement.