Parcours
/
Gleam
Gleam
/
Exercices
/
Attrape-les tous
Attrape-les tous

Attrape-les tous

Exercice d'apprentissage

Introduction

Ensembles

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])

Instructions

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.

1. Démarre une collection

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"])

2. Fais grandir la collection

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"]))

3. Commence à échanger

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"]))

4. Les cartes qu'ils ont tous

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"]

5. Toutes les cartes

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

6. Des cartes brillantes pour la victoire

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"])
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Gleam Exercism

Prêt à commencer Attrape-les tous ?

Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.