Un Set est une collection d'éléments qui présente les propriétés suivantes :
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
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.
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.
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"]))
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"
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"
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"]))
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"])
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"]
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"])
Inscris-toi sur Exercism pour apprendre et maîtriser Julia avec 35 concepts128 exercices, et un vrai mentorat humain, le tout gratuitement.