Ein Set ist eine Sammlung von Elementen mit den folgenden Eigenschaften:
Erstelle sie mit dem Set()-Konstruktor und gib einen beliebigen Iterator als Parameter an.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
Neue Elemente fügst du mit push!() hinzu (genauso wie bei Arrays) und entfernst sie mit 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
Wie bei mehreren anderen Sammlungstypen prüfst du die Zugehörigkeit mit dem Operator in oder ∈ (tippe \in und dann die Tabulatortaste für das Symbol).
julia> 3 ∈ s1
true
Die folgenden Operationen auf Paaren von Sets werden unterstützt (Abkürzungen für das Operatorsymbol stehen in Klammern).
union(A, B) oder A ∪ B (\cup): alle Elemente, die in A oder in B oder in beiden enthalten sind.intersect(A, B) oder A ∩ B (\cap): alle Elemente, die sowohl in A als auch in B enthalten sind.setdiff(A, B) (kein Symbol): Elemente, die in A, aber nicht in B enthalten sind.symdiff(A, B) (kein Symbol): Elemente, die in A oder in B, aber nicht in beiden enthalten sind.issubset(A, B) oder A ⊆ B (\subseteq) oder B ⊇ A (\supseteq): true, wenn alle Elemente von A auch in B enthalten sind.issetequal(A, B) (kein Symbol): true, wenn A und B genau dieselben Elemente enthalten.isdisjoint(A, B) (kein Symbol): true, wenn A und B keine gemeinsamen Elemente haben (die Schnittmenge also leer ist).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
Von vielen dieser Funktionen gibt es auch mutierende Varianten, bei denen dem Funktionsnamen ein ! angehängt wird. Eine vollständige Liste der Funktionen findest du im Handbuch.
Du und deine Geschäftspartner betreiben ein kleines Catering-Unternehmen. Ihr habt gerade zugestimmt, eine Veranstaltung für einen lokalen Kochclub auszurichten, bei der Gerichte aus der Kategorie „Club-Favoriten“ serviert werden. Der Club hat wenig Erfahrung mit der Ausrichtung großer Veranstaltungen und braucht Hilfe bei der Organisation, beim Einkaufen, bei der Vorbereitung und beim Servieren. Du hast beschlossen, ein paar kleine Julia-Funktionen zu schreiben, um den gesamten Planungsprozess zu beschleunigen.
Die Rezepte für die Veranstaltung stammen aus verschiedenen Quellen und ihre Zutaten scheinen doppelte (oder mehr) Einträge zu haben. Du willst schließlich keine überflüssigen Lebensmittel einkaufen! Bevor mit dem Einkaufen und Kochen begonnen werden kann, muss die Zutatenliste jedes Gerichts „bereinigt“ werden.
Implementiere die Funktion clean_ingredients(dish_name, dish_ingredients), die den Namen eines Gerichts und einen Vector mit Zutaten entgegennimmt.
Diese Funktion sollte ein Tuple zurückgeben, dessen erstes Element der Name des Gerichts ist, gefolgt von dem von Duplikaten bereinigten Set der Zutaten.
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"]))
Bei der Veranstaltung wird es sowohl Cocktails als auch „Mocktails“ geben, also Mixgetränke ohne Alkohol. Du musst sicherstellen, dass „Mocktail“-Getränke wirklich alkoholfrei sind und die Cocktails tatsächlich Alkohol enthalten.
Implementiere die Funktion check_drinks(drink_name, drink_ingredients), die den Namen eines Getränks und einen Vector mit Zutaten entgegennimmt.
Die Funktion sollte den Namen des Getränks gefolgt von „Mocktail“ zurückgeben, wenn das Getränk keine alkoholischen Zutaten enthält, und den Getränkenamen gefolgt von „Cocktail“, wenn das Getränk Alkohol enthält.
Für diese Übung enthalten Cocktails nur Alkohole aus der Konstante 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"
Auf der Gästeliste stehen Personen mit unterschiedlichen Ernährungsbedürfnissen, und dein Team muss die Gerichte in Vegan, Vegetarian, Paleo, Keto und Omnivore einteilen.
Implementiere die Funktion categorize_dish(dish_name, dish_ingredients), die den Namen eines Gerichts und ein set mit den Zutaten dieses Gerichts entgegennimmt.
Die Funktion sollte einen String mit dish name: CATEGORY zurückgeben (zu welcher Kategorie das Gericht gehört).
Alle Gerichte passen in eine der Kategorien: VEGAN, VEGETARIAN, PALEO, KETO oder 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"
Einige Gäste haben Allergien und zusätzliche Ernährungseinschränkungen. Diese Zutaten müssen für jedes Gericht gekennzeichnet werden, damit sie keine Probleme verursachen.
Implementiere die Funktion tag_special_ingredients(dish), die ein Tuple entgegennimmt, dessen erste Position der Name des Gerichts ist und dessen zweite Position ein Vector oder Set mit den Zutaten für dieses Gericht ist.
Gib den Namen des Gerichts zurück, gefolgt von dem Set der Zutaten, die einen besonderen Hinweis in der Gerichtsbeschreibung erfordern.
Die Zutaten eines Gerichts in einem Vector können Duplikate enthalten oder auch nicht.
Für diese Übung stehen alle Allergene oder besonderen Zutaten, die gekennzeichnet werden müssen, in der Konstante 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"]))
Zur Vorbereitung auf das Bestellen und Einkaufen musst du eine „Masterliste“ mit Zutaten für alles auf der Speisekarte zusammenstellen (die Mengen werden später ergänzt).
Implementiere die Funktion compile_ingredients(dishes), die einen Vector mit Gerichten entgegennimmt und ein Set aller Zutaten in allen aufgeführten Gerichten zurückgibt.
Jedes einzelne Gericht wird durch sein Set an Zutaten dargestellt.
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"])
Die Gastgeber haben dir eine Liste mit Gerichten gegeben, die sie als „mundgerechte“ Vorspeisen für die Servierplatten vorbereitet haben möchten. Diese musst du aus der Hauptliste der Gerichte herausziehen, die als größere Portionen zubereitet werden.
Implementiere die Funktion separate_appetizers(dishes, appetizers), die einen Vector mit Gerichtnamen und einen Vector mit Vorspeisennamen entgegennimmt.
Die Funktion sollte einen Vector mit der Liste der Gerichtnamen zurückgeben, aus der die Vorspeisennamen entfernt wurden.
Der Vector dishes oder appetizers könnte Duplikate enthalten und muss eventuell von Duplikaten bereinigt werden.
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"]
Innerhalb jeder Kategorie (VEGAN, VEGETARIAN, PALEO, KETO oder OMNIVORE) suchst du die Zutaten heraus, die nur in einem Gericht vorkommen.
Diese „Singleton“-Zutaten bekommt eine eigene Einkaufsperson zugewiesen, damit sie in der Hektik nicht vergessen werden.
Implementiere die Funktion singleton_ingredients(dishes, intersection), die einen Vector mit Gerichten und eine Konstante CATEGORY_INTERSECTION für dieselbe Kategorie entgegennimmt.
Jedes Gericht wird durch ein Set seiner Zutaten dargestellt.
Jede CATEGORY_INTERSECTION ist ein Set von Zutaten, die in mehr als einem Gericht der Kategorie vorkommen.
Mithilfe von Mengenoperationen sollte deine Funktion ein Set von „Singleton“-Zutaten zurückgeben (Zutaten, die nur in einem Gericht der Kategorie vorkommen).
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"])
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.