Ένα Set είναι μια συλλογή στοιχείων με τις εξής ιδιότητες:
Τα δημιουργείς με τον κατασκευαστή Set(), χρησιμοποιώντας οποιονδήποτε iterator ως παράμετρο.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
Προσθέτεις νέα στοιχεία με το push!() (όπως ακριβώς με τους πίνακες) και τα αφαιρείς με το 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
Όπως και με αρκετούς άλλους τύπους συλλογών, ελέγχεις αν ένα στοιχείο ανήκει στο σύνολο με τον τελεστή in ή ∈ (πληκτρολόγησε \in και μετά tab για το σύμβολο).
julia> 3 ∈ s1
true
Υποστηρίζονται οι παρακάτω πράξεις σε ζεύγη συνόλων (οι συντομεύσεις για το σύμβολο του τελεστή δίνονται σε παρενθέσεις).
union(A, B) ή A ∪ B (\cup): όλα τα στοιχεία που ανήκουν στο A ή στο B ή και στα δύο.intersect(A, B) ή A ∩ B (\cap): όλα τα κοινά στοιχεία των A και B.setdiff(A, B) (χωρίς σύμβολο): τα στοιχεία που ανήκουν στο A αλλά όχι στο B.symdiff(A, B) (χωρίς σύμβολο): τα στοιχεία που ανήκουν στο A ή στο B αλλά όχι και στα δύο.issubset(A, B) ή A ⊆ B (\subseteq) ή B ⊇ A (\supseteq): true αν όλα τα στοιχεία του A ανήκουν και στο B.issetequal(A, B) (χωρίς σύμβολο): true αν τα A και B περιέχουν ακριβώς τα ίδια στοιχεία.isdisjoint(A, B) (χωρίς σύμβολο): true αν τα A και B δεν έχουν κανένα κοινό στοιχείο (δηλαδή η τομή τους είναι κενή).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
Υπάρχουν επίσης εκδόσεις πολλών από αυτές που μεταλλάσσουν το σύνολο, με ! να προστίθεται στο όνομα της συνάρτησης.
Δες το εγχειρίδιο για έναν πλήρη κατάλογο συναρτήσεων.
Εσύ και οι επιχειρηματικοί σου συνεργάτες λειτουργείτε μια μικρή εταιρεία catering. Μόλις συμφώνησες να διοργανώσεις μια εκδήλωση για έναν τοπικό σύλλογο μαγειρικής με πιάτα "αγαπημένα του συλλόγου". Ο σύλλογος δεν έχει εμπειρία στη διοργάνωση μεγάλων εκδηλώσεων και χρειάζεται βοήθεια με την οργάνωση, τα ψώνια, την προετοιμασία και το σερβίρισμα. Αποφάσισες να γράψεις μερικές μικρές συναρτήσεις Julia για να επιταχύνεις όλη τη διαδικασία σχεδιασμού.
Οι συνταγές της εκδήλωσης προστέθηκαν από διάφορες πηγές και τα συστατικά τους φαίνεται να έχουν διπλότυπες (ή περισσότερες) καταχωρήσεις, και δεν θέλεις να καταλήξεις να αγοράσεις περιττά υλικά! Πριν ξεκινήσουν τα ψώνια και το μαγείρεμα, η λίστα συστατικών κάθε πιάτου πρέπει να "καθαριστεί".
Υλοποίησε τη συνάρτηση clean_ingredients(dish_name, dish_ingredients) που παίρνει το όνομα ενός πιάτου και ένα Vector από συστατικά.
Αυτή η συνάρτηση θα πρέπει να επιστρέφει ένα Tuple με το όνομα του πιάτου ως πρώτο στοιχείο, ακολουθούμενο από το Set των συστατικών χωρίς διπλότυπα.
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"]))
Η εκδήλωση θα περιλαμβάνει και κοκτέιλ και "μοκτέιλ", μικτά ποτά χωρίς το αλκοόλ. Πρέπει να διασφαλίσεις ότι τα ποτά "μοκτέιλ" είναι πραγματικά χωρίς αλκοόλ και ότι τα κοκτέιλ περιέχουν όντως αλκοόλ.
Υλοποίησε τη συνάρτηση check_drinks(drink_name, drink_ingredients) που παίρνει το όνομα ενός ποτού και ένα Vector από συστατικά.
Η συνάρτηση θα πρέπει να επιστρέφει το όνομα του ποτού ακολουθούμενο από "Mocktail" αν το ποτό δεν έχει αλκοολούχα συστατικά, και το όνομα του ποτού ακολουθούμενο από "Cocktail" αν το ποτό περιέχει αλκοόλ.
Για τους σκοπούς αυτής της άσκησης, τα κοκτέιλ θα περιλαμβάνουν μόνο αλκοόλ από τη σταθερά 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"
Η λίστα καλεσμένων περιλαμβάνει συνδαιτυμόνες με διαφορετικές διατροφικές ανάγκες, και το προσωπικό σου θα πρέπει να χωρίσει τα πιάτα σε Vegan, Vegetarian, Paleo, Keto και Omnivore.
Υλοποίησε τη συνάρτηση categorize_dish(dish_name, dish_ingredients) που παίρνει το όνομα ενός πιάτου και ένα set με τα συστατικά αυτού του πιάτου.
Η συνάρτηση θα πρέπει να επιστρέφει ένα String με τη μορφή dish name: CATEGORY (σε ποια κατηγορία γεύματος ανήκει το πιάτο).
Όλα τα πιάτα θα "ταιριάζουν" σε μία από τις κατηγορίες: VEGAN, VEGETARIAN, PALEO, KETO ή 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"
Κάποιοι καλεσμένοι έχουν αλλεργίες και πρόσθετους διατροφικούς περιορισμούς. Αυτά τα συστατικά πρέπει να επισημαίνονται/σημειώνονται για κάθε πιάτο ώστε να μην προκαλούν προβλήματα.
Υλοποίησε τη συνάρτηση tag_special_ingredients(dish) που παίρνει ένα Tuple με το όνομα του πιάτου στην πρώτη θέση, και ένα Vector ή Set με τα συστατικά αυτού του πιάτου στη δεύτερη θέση.
Επίστρεψε το όνομα του πιάτου ακολουθούμενο από το Set των συστατικών που χρειάζονται ειδική σημείωση στην περιγραφή του πιάτου.
Τα συστατικά του πιάτου μέσα σε ένα Vector μπορεί να έχουν ή να μην έχουν διπλότυπα.
Για τους σκοπούς αυτής της άσκησης, όλα τα αλλεργιογόνα ή ειδικά συστατικά που χρειάζονται επισήμανση βρίσκονται στη σταθερά 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"]))
Ως προετοιμασία για τις παραγγελίες και τα ψώνια, θα χρειαστεί να συντάξεις μια "κύρια λίστα" με συστατικά για όλα όσα υπάρχουν στο μενού (οι ποσότητες θα συμπληρωθούν αργότερα).
Υλοποίησε τη συνάρτηση compile_ingredients(dishes) που παίρνει ένα Vector από πιάτα και επιστρέφει ένα σύνολο με όλα τα συστατικά όλων των πιάτων που περιλαμβάνονται στη λίστα.
Κάθε μεμονωμένο πιάτο αντιπροσωπεύεται από το Set των συστατικών του.
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"])
Οι οικοδεσπότες σου έδωσαν μια λίστα με πιάτα που θα ήθελαν να προετοιμαστούν ως ορεκτικά "μικρών μπουκιών" για σερβίρισμα σε δίσκους. Πρέπει να τα ξεχωρίσεις από την κύρια λίστα των πιάτων που ετοιμάζονται ως μεγαλύτερες μερίδες.
Υλοποίησε τη συνάρτηση separate_appetizers(dishes, appetizers) που παίρνει ένα Vector με ονόματα πιάτων και ένα Vector με ονόματα ορεκτικών.
Η συνάρτηση θα πρέπει να επιστρέφει ένα Vector με τη λίστα των ονομάτων πιάτων αφού αφαιρεθούν τα ονόματα των ορεκτικών.
Είτε το Vector dishes είτε το Vector appetizers μπορεί να περιέχει διπλότυπα και ενδέχεται να χρειάζεται αφαίρεση των διπλότυπων.
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"]
Μέσα σε κάθε κατηγορία (VEGAN, VEGETARIAN, PALEO, KETO ή OMNIVORE), θα ξεχωρίσεις τα συστατικά που εμφανίζονται σε ένα μόνο πιάτο.
Αυτά τα "singleton" συστατικά θα ανατεθούν σε έναν ειδικό αγοραστή ώστε να διασφαλιστεί ότι δεν θα ξεχαστούν στη βιασύνη να γίνουν όλα τα υπόλοιπα.
Υλοποίησε τη συνάρτηση singleton_ingredients(dishes, intersection) που παίρνει ένα Vector από πιάτα και μια σταθερά CATEGORY_INTERSECTION για την ίδια κατηγορία.
Κάθε πιάτο αντιπροσωπεύεται από ένα Set με τα συστατικά του.
Κάθε CATEGORY_INTERSECTION είναι ένα Set με συστατικά που εμφανίζονται σε περισσότερα από ένα πιάτα στην κατηγορία.
Χρησιμοποιώντας πράξεις συνόλων, η συνάρτηση σου θα πρέπει να επιστρέφει ένα Set με "singleton" συστατικά (συστατικά που εμφανίζονται σε ένα μόνο πιάτο στην κατηγορία).
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"])
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.