Parcours
/
Elm
Elm
/
Exercices
/
Chipez-les tous !
Chipez-les tous !

Chipez-les tous !

Exercice d'apprentissage

Introduction

Ensemble

Un Set a est une séquence de valeurs uniques de type a. Les valeurs doivent être de type comparable (Int, Float, Time, Char, String, ainsi que les tuples ou les listes de types comparables).

On peut transformer des listes en ensembles et inversement avec Set.toList et Set.fromList. Grâce à la structure interne de Set, on a la garantie qu'une liste obtenue avec Set.fromList sera triée.

Set.fromList [2, 3, 3, 3, 1, 1, 2]
    --> Set.fromList [1, 2, 3]

Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
    --> [1, 2, 3]

On peut créer et remplir des ensembles avec Set.empty, Set.singleton, Set.insert et Set.remove.

Set.empty
    --> Set.fromList []

Set.singleton "hi"
    --> Set.fromList ["hi"]

eightyEight = Set.singleton 88

Set.insert 88 eightyEight
    --> Set.fromList [88]

Set.insert 89 eightyEight
    --> Set.fromList [88, 89]

Set.remove 88 eightyEight
    --> Set.fromList []

Set.remove 89 eightyEight
    --> Set.fromList [88]

On peut interroger le contenu d'un ensemble avec les fonctions Set.member, Set.isEmpty et Set.size.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

On peut combiner des ensembles avec Set.union, Set.intersect et Set.diff.

a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Set.union a b
    --> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

Set.intersect a b
    --> Set.fromList [1, 10]

Set.diff a b
    --> Set.fromList [100]

Set.diff b a
    --> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]

On peut filtrer et partitionner des ensembles.

even n = modBy 2 n == 0

Set.filter even b
    --> Set.fromList [2, 4, 6, 8, 10]

Set.partition even b
    --> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])

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 Card est représentée par Set Card, puisque les doublons n'ont pas d'importance quand ton objectif est de réunir toutes les cartes existantes.

1. Commence une collection

Tu veux vraiment que tes amis rejoignent ta folie Blorkemon™️, et la meilleure façon est d'amorcer leur collection en leur donnant une carte.

Implémente newCollection, qui transforme une carte en collection.

newCollection "Newthree"
    --> Set.fromList ["Newthree"]

2. Fais grandir la collection

Une fois que tu as une collection, elle prend vie et doit grandir.

Implémente addCard, qui prend une Card et une collection, et renvoie un Tuple à deux valeurs : un Bool qui indique si la Card était déjà dans la collection, et la collection avec la carte ajoutée.

addCard "Scientuna" (Set.fromList ["Newthree"])
    --> (False, Set.fromList ["Newthree", "Scientuna"])

3. Commence à échanger

Maintenant que tes amis sont redevenus fous de Blorkemon™️, tu peux en profiter pour faire grandir ta propre collection en échangeant des cartes.

Tous les échanges ne valent pas le coup, et certains ne sont même pas possibles. Tu ne peux pas échanger une carte que tu n'as pas, et tu ne devrais pas échanger une carte contre une que tu as déjà.

Implémente tradeCard, qui prend deux cartes à échanger (la tienne et la leur) et ta collection actuelle. La valeur de retour est un Tuple de deux valeurs : un Bool indiquant si l'échange est possible et vaut le coup, et la collection que tu obtiendrais si tu faisais l'échange (même s'il n'est pas réellement possible).

tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
    --> (True, Set.fromList ["Newthree"])

4. Il ne peut y en avoir qu'un de chaque

Tu trouves une vieille réserve de cartes dans un marché aux puces. Tu dois trier les cartes et retirer les doublons pour comparer la liste à ta collection.

Implémente removeDuplicates, qui trie une liste de cartes et renvoie une liste de cartes triées et uniques.

removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
    --> ["Newthree", "Scientuna"]

5. Les cartes qui leur manquent

Il est temps d'être fier de ta collection.

Implémente extraCards, qui prend ta collection et une autre collection, et renvoie le nombre de cartes que l'autre collection n'a pas.

extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
    --> 0

6. Les cartes communes à toutes

Toi et tes amis passionnés de Blorkemon™️, vous vous réunissez et vous vous demandez quelles cartes sont les plus courantes.

Implémente boringCards, qui prend une liste de collections et renvoie une liste triée de cartes que toutes les collections ont.

boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> ["Scientuna"]

7. Toutes les cartes

Est-ce que toi et tes amis, vous possédez collectivement toutes les cartes Blorkemon™️ ?

Implémente totalCards, qui prend une liste de collections et renvoie le nombre total de cartes différentes dans l'ensemble des collections.

totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> 2

8. Shiny pour la victoire

Ton neveu vient bientôt te rendre visite, et tu as envie de l'impressionner. Les enfants aiment les choses brillantes, non ? Les cartes Blorkemon™️ peuvent être brillantes !

Implémente splitShinyCards, qui prend une collection et renvoie un Tuple avec deux listes de cartes triées : une avec toutes les cartes qui commencent par "Shiny" et une avec les autres cartes.

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elm Exercism

Prêt à commencer Chipez-les tous ! ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.