Un Set è una collezione di elementi con le seguenti proprietà:
Puoi crearli con il costruttore Set(), usando un qualsiasi iteratore come parametro.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
Aggiungi nuovi elementi con push!() (come si fa con gli array) e rimuovili con 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
Come per diversi altri tipi di collezione, puoi verificare l'appartenenza con l'operatore in o ∈ (digita \in e poi tab per ottenere il simbolo).
julia> 3 ∈ s1
true
Sono supportate le seguenti operazioni su coppie di Set (le scorciatoie per il simbolo dell'operatore sono mostrate tra parentesi).
union(A, B) o A ∪ B (\cup): tutti gli elementi in A o B o in entrambi.intersect(A, B) o A ∩ B (\cap): tutti gli elementi comuni sia ad A che a B.setdiff(A, B) (nessun simbolo): gli elementi in A ma non in B.symdiff(A, B) (nessun simbolo): gli elementi in A o in B ma non in entrambi.issubset(A, B) o A ⊆ B (\subseteq) o B ⊇ A (\supseteq): true se tutti gli elementi di A sono anche in B.issetequal(A, B) (nessun simbolo): true se A e B contengono esattamente gli stessi elementi.isdisjoint(A, B) (nessun simbolo): true se A e B non hanno elementi in comune (cioè l'intersezione è vuota).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
Esistono anche versioni mutanti di molte di queste operazioni, con ! aggiunto al nome della funzione.
Consulta il manuale per un elenco completo delle funzioni.
Tu e i tuoi soci gestite una piccola azienda di catering. Avete appena accettato di organizzare un evento per un club di cucina locale che propone i piatti «preferiti dal club». Il club ha poca esperienza nell'organizzare grandi eventi e ha bisogno di aiuto con l'organizzazione, la spesa, la preparazione e il servizio. Hai deciso di scrivere alcune piccole funzioni in Julia per velocizzare l'intero processo di pianificazione.
Le ricette dell'evento sono state aggiunte da fonti diverse e i loro ingredienti sembrano avere voci duplicate (o più). Non vuoi ritrovarti ad acquistare ingredienti in eccesso! Prima che la spesa e la cottura possano iniziare, l'array degli ingredienti di ogni piatto deve essere «ripulito».
Implementa la funzione clean_ingredients(dish_name, dish_ingredients) che prende il nome di un piatto e un Vector di ingredienti.
Questa funzione deve restituire un Tuple con il nome del piatto come primo elemento, seguito dal Set di ingredienti senza duplicati.
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'evento includerà sia cocktail che «mocktail», bevande miscelate senza alcol. Devi assicurarti che le bevande «mocktail» siano davvero analcoliche e che i cocktail contengano davvero l'alcol.
Implementa la funzione check_drinks(drink_name, drink_ingredients) che prende il nome di una bevanda e un Vector di ingredienti.
La funzione deve restituire il nome della bevanda seguito da "Mocktail" se la bevanda non ha ingredienti alcolici, e il nome della bevanda seguito da "Cocktail" se la bevanda contiene alcol.
Ai fini di questo esercizio, i cocktail includeranno solo gli alcolici della costante 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 lista degli invitati comprende commensali con esigenze alimentari diverse, e il tuo staff dovrà suddividere i piatti in Vegan, Vegetarian, Paleo, Keto e Omnivore.
Implementa la funzione categorize_dish(dish_name, dish_ingredients) che prende il nome di un piatto e un set degli ingredienti di quel piatto.
La funzione deve restituire una String con il formato dish name: CATEGORY (a quale categoria appartiene il piatto).
Tutti i piatti «rientreranno» in una delle categorie: VEGAN, VEGETARIAN, PALEO, KETO o 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"
Alcuni ospiti hanno allergie e ulteriori restrizioni alimentari. Questi ingredienti devono essere etichettati/annotati per ogni piatto, in modo che non causino problemi.
Implementa la funzione tag_special_ingredients(dish) che prende un Tuple con il nome del piatto in prima posizione e un Vector o Set di ingredienti per quel piatto in seconda posizione.
Restituisci il nome del piatto seguito dal Set di ingredienti che richiedono una nota speciale nella descrizione del piatto.
Gli ingredienti di un piatto contenuti in un Vector possono avere o meno duplicati.
Ai fini di questo esercizio, tutti gli allergeni o gli ingredienti speciali che devono essere etichettati si trovano nella costante 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"]))
Per preparare gli ordini e la spesa, dovrai compilare una «lista principale» di ingredienti per tutto ciò che è nel menu (le quantità da inserire in seguito).
Implementa la funzione compile_ingredients(dishes) che prende un Vector di piatti e restituisce un set di tutti gli ingredienti presenti in tutti i piatti elencati.
Ogni singolo piatto è rappresentato dal suo Set di ingredienti.
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"])
Gli organizzatori ti hanno dato un array di piatti che vorrebbero preparare come antipasti «da un boccone», da servire su vassoi. Devi estrarli dall'array principale dei piatti preparati come porzioni più abbondanti.
Implementa la funzione separate_appetizers(dishes, appetizers) che prende un Vector di nomi di piatti e un Vector di nomi di antipasti.
La funzione deve restituire un Vector con i nomi dei piatti privati dei nomi degli antipasti.
Sia il Vector dishes che il Vector appetizers potrebbero contenere duplicati e potrebbero richiedere la rimozione dei duplicati.
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"]
All'interno di ogni categoria (VEGAN, VEGETARIAN, PALEO, KETO o OMNIVORE) estrarrai gli ingredienti che compaiono in un solo piatto.
A questi ingredienti «singleton» verrà assegnato un addetto alla spesa dedicato, per assicurarti che non vengano dimenticati nella fretta di completare tutto il resto.
Implementa la funzione singleton_ingredients(dishes, intersection) che prende un Vector di piatti e una costante CATEGORY_INTERSECTION per la stessa categoria.
Ogni piatto è rappresentato da un Set dei suoi ingredienti.
Ogni CATEGORY_INTERSECTION è un Set di ingredienti che compaiono in più di un piatto della categoria.
Usando le operazioni sugli insiemi, la funzione deve restituire un Set di ingredienti «singleton» (ingredienti che compaiono in un solo piatto della categoria).
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"])
Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.