Parcours
/
Elm
Elm
/
Exercices
/
Les cartes Blorkemon
Les cartes Blorkemon

Les cartes Blorkemon

Exercice d'apprentissage

Introduction

Comparaison

Égalité

On peut vérifier si deux types Elm sont « identiques » avec l'opérateur d'égalité (==). L'opérateur de non-égalité est (/=) (et non != comme dans beaucoup de langages). L'opérateur d'égalité fonctionne sur les littéraux, les tuples, les enregistrements et les types personnalisés.

1 == 2
    --> False

1 /= 2
    --> True

(1, 2) == (2, 1)
    --> False

type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]

type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings =  (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}

a == b
    --> True

Note que tu ne dois jamais comparer de fonctions, sous peine de faire planter le programme à l'exécution.

Comparaisons

Les opérateurs de comparaison (<), (<=), (>), (>=) et les fonctions min, max, compare fonctionnent sur les types comparable. Le type comparable est un type spécial qui regroupe tous les types natifs que l'on peut comparer : les nombres, les caractères, les strings, les listes d'éléments comparables et les tuples d'éléments comparables.

1 < 1 + 1
    --> True

'x' < 'X'
    --> False

"abc" < "abz"
    --> True

"abc" < "abcd"
    --> True

"abc" < "b"
    --> True

min [1 , 2, 9000] [10]
    --> [1 , 2, 9000]

min (1, "hello") (3, "bye")
    --> (1, "hello")

Les valeurs d'autres types, comme les enregistrements ou les types personnalisés, ne peuvent pas être comparées directement.

Certains types natifs exigent que leur contenu soit comparable, comme les clés de Set ou de Dict, car leur structure repose sur un ordre interne.

Les listes de valeurs comparable peuvent être triées avec List.sort, et les listes de valeurs que l'on peut transformer en valeurs comparables peuvent être triées avec List.sortBy. Si tu as besoin d'un tri hiérarchique (trier selon une propriété, puis départager les égalités avec une autre), tu peux aussi utiliser des tuples ou des listes avec List.sortBy, car les tuples et les listes sont triés dans l'ordre lexicographique.

List.sort ["hi", "hello", "bye", "goodbye"]
    --> ["bye", "goodbye", "hello", "hi"]

List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
    --> ["hi", "bye", "hello", "goodbye"]

-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
    --> ["hi", "bye", "dad", "mum", "sis", "hello"]

La fonction compare prend deux valeurs comparable et renvoie un Order. Un Order est un type qui permet de vérifier en une seule opération si une valeur est supérieure (GT), égale (EQ) ou inférieure (LT) à une autre.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

On peut construire des fonctions de comparaison pour des types arbitraires et les utiliser, par exemple, pour trier avec List.sortWith :

type Color = Red | Green | Blue

compareColors : Color -> Color -> Order
compareColors a b =
  case (a, b) of
    (Red, Red) -> EQ
    (Red, _) -> LT
    (_, Red) -> GT
    (Green, Green) -> EQ
    (Green, _) -> LT
    (_, Green) -> GT
    (Blue, Blue) -> EQ

List.sortWith compareColors [Blue, Red, Green, Green, Blue]
    --> [Red, Green, Green, Blue, Blue]

Instructions

Tu ressens soudain une bouffée de nostalgie et une forte envie de dépoussiérer tes vieilles cartes Blorkemon™️. Les cartes Blorkemon™️, c'est un excellent jeu d'échange de cartes à l'ancienne. Chaque Card représente un monstre Blorkemon™️, avec son niveau de puissance d'attaque et, si tu as de la chance, la carte peut même être brillante.

1. Compare les niveaux de puissance

Chaque carte Blorkemon™️ semble plus puissante que la précédente, mais tu as intérêt à vérifier.

Implémente la fonction isMorePowerful. Elle doit renvoyer True si la carte passée en premier argument est strictement plus puissante que l'autre, et False sinon.

newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True

isMorePowerful newthree scientuna
    --> True

2. Trouve la puissance la plus élevée

Avec une main pleine de cartes Blorkemon™️, tu devrais pouvoir préparer l'attaque la plus dévastatrice.

Implémente la fonction maxPower, qui renvoie la puissance la plus élevée de deux cartes.

maxPower newthree scientuna
    --> 120

3. Trie les cartes

Tu crois te souvenir que tu avais au moins une carte de chaque Blorkemon™️, mais ça fait un moment que tu n'as pas vérifié : tu devrais trier tes cartes pour les comparer à la liste officielle sur Pulpapedia.

Implémente la fonction sortByMonsterName, qui prend une liste de Cards et renvoie une liste triée par nom de monstre.

sortByMonsterName [newthree, scientuna]
    --> [Card "Newthree" 120 False, Card "Scientuna" 6 True]

4. Les cartes les plus cool en premier

Les Blorkemon™️ sont la chose la plus cool qui soit. Tu n'emploies pas ce terme à la légère : tu as une méthode scientifique pour le démontrer.

Implémente la fonction sortByCoolness, qui trie une liste de cartes en plaçant les plus cool en premier. Le degré de coolness d'une carte est d'abord déterminé par son caractère brillant : toutes les cartes brillantes sont bien plus cool que les autres. Le second critère est le niveau de puissance : plus il est élevé, mieux c'est.

sortByCoolness [newthree, scientuna]
    --> [Card "Scientuna" 6 True, Card "Newthree" 120 False]

5. Shiny Power

Le caractère brillant n'est pas là que pour le spectacle : dans un combat entre deux Blorkemon™️ de puissance égale, c'est toujours le brillant qui l'emporte. C'est ce qu'on appelle la Shiny Power.

Implémente la fonction compareShinyPower, qui codifie cette propriété. L'Order de deux cartes est déterminé par leurs niveaux de puissance s'ils sont différents, mais s'ils sont égaux, une carte brillante est supérieure.

compareShinyPower newthree scientuna
    --> GT

6. Fais tes paris

Dans une partie de cartes Blorkemon™️, tout est permis, mais il reste une tendance : les cartes les plus puissantes ont plus souvent tendance à gagner.

Implémente la fonction expectedWinner qui renvoie le nom du monstre qui a le plus de chances de gagner, selon l'ordre établi par compareShinyPower. La fonction doit renvoyer le nom du monstre du gagnant attendu, ou « too close to call » si les deux adversaires ont la même Shiny Power.

expectedWinner newthree scientuna
    --> "Newthree"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elm Exercism

Prêt à commencer Les cartes Blorkemon ?

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