Ένα σύνολο είναι μια αμετάβλητη και μη διατεταγμένη συλλογή μοναδικών τιμών. Όλα τα στοιχεία ενός συνόλου πρέπει να είναι του ίδιου τύπου.
Το gleam/set ορίζει τον τύπο Set και παρέχει συναρτήσεις για την εργασία με σύνολα.
Μπορείς να μετατρέπεις λίστες και σύνολα μεταξύ τους με τα set.to_list και set.from_list. Η σειρά των στοιχείων σε ένα σύνολο δεν είναι εγγυημένη.
set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])
set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]
Μπορείς να δημιουργείς και να γεμίζεις σύνολα με τα set.new, set.insert και set.delete.
set.new()
// -> set.from_list([])
let eighty_eight = set.from_list([88])
set.insert(eighty_eight, 88)
// -> set.from_list([88])
set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])
set.delete(eighty_eight, 89)
// -> set.from_list([88])
Μπορείς να ελέγχεις τα περιεχόμενα ενός συνόλου με τις συναρτήσεις set.contains και set.size.
set.contains(eighty_eight, 88)
// -> True
set.size(eighty_eight)
// -> 1
Τα σύνολα μπορούν να συνδυαστούν με τα set.union και set.intersection.
let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])
set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])
set.intersection(a, b)
// -> set.from_list([1, 5])
Μπορείς να φιλτράρεις σύνολα.
let is_small = fn(n) { n <= 3 }
set.filter(b, is_small)
// -> set.from_list([1, 2, 3])
Η νοσταλγία σου για τις κάρτες Blorkemon™️ δε λέει να κοπάσει, άρχισες μάλιστα να τις συλλέγεις ξανά και παροτρύνεις κιόλας τους φίλους σου να συμμετάσχουν.
Σε αυτή την άσκηση, μια συλλογή καρτών αναπαρίσταται με Set(String), καθώς οι διπλότυπες κάρτες δεν έχουν σημασία όταν ο στόχος σου είναι να αποκτήσεις όλες τις υπάρχουσες κάρτες.
Θέλεις πραγματικά να μπουν και οι φίλοι σου στην τρέλα σου με τα Blorkemon™️, και ο καλύτερος τρόπος είναι να ξεκινήσεις τη συλλογή τους χαρίζοντάς τους μία κάρτα.
Υλοποίησε τη συνάρτηση new_collection, που μετατρέπει μια κάρτα σε συλλογή.
new_collection("Newthree")
// -> set.from_list(["Newthree"])
Μόλις αποκτήσεις μια συλλογή, αποκτά δική της ζωή και πρέπει να μεγαλώσει.
Υλοποίησε τη συνάρτηση add_card, που παίρνει μια κάρτα και μια συλλογή και επιστρέφει μια πλειάδα με δύο τιμές: ένα Bool που δείχνει αν η κάρτα ήταν ήδη στη συλλογή, και τη συλλογή με την κάρτα να έχει προστεθεί.
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
Τώρα που οι φίλοι σου έχουν ξανατρελαθεί με τα Blorkemon™️, μπορείς να το χρησιμοποιήσεις αυτό για να μεγαλώσεις τη δική σου συλλογή ανταλλάσσοντας κάρτες.
Δεν αξίζει να κάνεις κάθε ανταλλαγή, ούτε μπορούν να γίνουν όλες. Δε μπορείς να ανταλλάξεις μια κάρτα που δεν έχεις, και δεν πρέπει να ανταλλάξεις μια κάρτα με μια που έχεις ήδη.
Υλοποίησε τη συνάρτηση trade_card, που παίρνει δύο κάρτες προς ανταλλαγή (τη δική σου και τη δική τους) και την τρέχουσα συλλογή σου.
Η τιμή επιστροφής είναι μια πλειάδα με δύο τιμές: ένα Bool που δηλώνει αν η ανταλλαγή είναι εφικτή και αξίζει να γίνει, και η συλλογή στην οποία θα κατέληγες αν έκανες την ανταλλαγή (ακόμα κι αν δεν είναι στην πραγματικότητα εφικτή).
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
Εσύ και οι φίλοι σου που λατρεύουν τα Blorkemon™️ μαζεύεστε και αναρωτιέστε ποιες κάρτες είναι οι πιο συνηθισμένες.
Υλοποίησε τη συνάρτηση boring_cards, που παίρνει μια λίστα με συλλογές και επιστρέφει μια λίστα με ταξινομημένες κάρτες που τις έχουν όλες οι συλλογές.
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
Έχετε εσύ και οι φίλοι σου μαζί όλες τις κάρτες Blorkemon™️;
Υλοποίησε τη συνάρτηση total_cards, που παίρνει μια λίστα με συλλογές και επιστρέφει τον συνολικό αριθμό διαφορετικών καρτών σε όλες τις συλλογές.
total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2
Ο ανιψιός σου έρχεται να σε επισκεφτεί σύντομα και θέλεις να τον εντυπωσιάσεις. Στα παιδιά αρέσουν τα λαμπερά πράγματα, έτσι δεν είναι; Οι κάρτες Blorkemon™️ μπορούν να είναι shiny!
Υλοποίησε τη συνάρτηση shiny_cards, που παίρνει μια συλλογή και επιστρέφει ένα σύνολο που περιέχει όλες τις κάρτες που αρχίζουν με "Shiny ".
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.