Un ensemble est une collection immuable et non ordonnée de valeurs uniques. Tous les éléments d'un ensemble doivent être du même type.
Le module gleam/set définit le type Set et fournit des fonctions pour manipuler les ensembles.
On peut convertir des listes en ensembles, et inversement, avec set.to_list et set.from_list. L'ordre des éléments d'un ensemble n'est pas garanti.
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]
On peut créer et remplir des ensembles avec set.new, set.insert et 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])
On peut interroger le contenu d'un ensemble avec les fonctions set.contains et set.size.
set.contains(eighty_eight, 88)
// -> True
set.size(eighty_eight)
// -> 1
On peut combiner des ensembles avec set.union et 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])
On peut filtrer des ensembles.
let is_small = fn(n) { n <= 3 }
set.filter(b, is_small)
// -> set.from_list([1, 2, 3])
Ta nostalgie pour les cartes Blorkemon™️ ne montre aucun signe de ralentissement : tu as même recommencé à les collectionner, et tu entraînes tes amis avec toi.
Dans cet exercice, une collection de cartes est représentée par Set(String), car les cartes en double n'ont pas d'importance quand ton objectif est d'obtenir toutes les cartes existantes.
Tu veux vraiment que tes amis rejoignent ta folie Blorkemon™️, et le meilleur moyen est de lancer leur collection en leur offrant une carte.
Implémente new_collection, qui transforme une carte en collection.
new_collection("Newthree")
// -> set.from_list(["Newthree"])
Une fois que tu as une collection, elle prend vie et doit grandir.
Implémente add_card, qui prend une carte et une collection, et renvoie un tuple à deux valeurs : un Bool qui indique si la carte était déjà dans la collection, et la collection avec la carte ajoutée.
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
Maintenant que tes amis sont redevenus fous de Blorkemon™️, tu peux en profiter pour agrandir ta propre collection en échangeant des cartes.
Tous les échanges ne valent pas la peine, et certains sont même impossibles. Tu ne peux pas échanger une carte que tu n'as pas, et tu ne devrais pas échanger une carte contre une que tu possèdes déjà.
Implémente trade_card, qui prend les deux cartes à échanger (la tienne et la sienne) ainsi que ta collection actuelle.
La valeur de retour est un tuple de deux valeurs : un Bool qui indique si l'échange est possible et vaut la peine d'être fait, et la collection que tu obtiendrais si tu faisais l'échange (même s'il n'est pas réellement possible).
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
Tes amis passionnés de Blorkemon™️ et toi vous réunissez et vous demandez quelles cartes sont les plus courantes.
Implémente boring_cards, qui prend un tableau de collections et renvoie un tableau trié des cartes que toutes les collections possèdent.
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
Est-ce que tes amis et toi possédez ensemble toutes les cartes Blorkemon™️ ?
Implémente total_cards, qui prend un tableau de collections et renvoie le nombre total de cartes différentes dans l'ensemble des collections.
total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2
Ton neveu vient bientôt te rendre visite, et tu as envie de l'impressionner. Les enfants aiment les choses qui brillent, non ? Les cartes Blorkemon™️ peuvent être brillantes !
Implémente shiny_cards, qui prend une collection et renvoie un ensemble contenant toutes les cartes qui commencent par "Shiny ".
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.