Parcours
/
Elixir
Elixir
/
Exercices
/
Jeu de devinettes
Jeu de devinettes

Jeu de devinettes

Exercice d'apprentissage

Introduction

Fonctions à plusieurs clauses

Elixir facilite la mise en œuvre du principe ouvert/fermé en permettant aux fonctions d'avoir plusieurs clauses. Ainsi, au lieu d'étaler une logique de contrôle « en dur », c'est-à-dire une logique qui fige les valeurs dans le code plutôt que de les rendre modifiables à tout moment, on peut écrire des fonctions ciblées auxquelles il est facile d'ajouter ou de retirer un comportement.

Elixir propose les clauses de fonction multiples et les gardes pour écrire :

def number(n) when n == 7 do
  "Awesome, that's my favorite"
end

def number(_n) do
  "That's not my favorite"
end

À l'exécution, Elixir teste, du haut vers le bas du fichier source, la clause de fonction à invoquer.

Les variables inutilisées doivent être préfixées par un underscore.

Gardes

Les gardes servent à empêcher Elixir d'appeler une fonction selon le résultat de l'évaluation des arguments par les fonctions de garde. Une garde commence par le mot-clé when, suivi d'une expression booléenne. Les fonctions de garde sont des fonctions spéciales qui :

  • doivent être pures et ne modifier aucun état global ;
  • doivent renvoyer strictement true ou false.

Tu trouveras une liste des gardes courantes dans la documentation d'Elixir. Elle comprend des vérifications de type, de l'arithmétique de base, des comparaisons et des opérateurs strictement booléens.

Arguments par défaut

Les fonctions peuvent déclarer des valeurs par défaut pour un ou plusieurs arguments. Prenons cette fonction :

def number(n \\ 13), do: "That's not my favorite"

À la compilation, Elixir crée une définition de fonction pour number/0 (sans argument) et number/1 (avec un argument).

Si plusieurs arguments ont des valeurs par défaut, celles-ci sont appliquées à la fonction de gauche à droite pour combler les arguments manquants.

Si la fonction comporte plusieurs clauses, les arguments par défaut doivent être définis dans un en-tête de fonction (une fonction sans corps) avant les clauses de la fonction :

def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."

Instructions

Tu crées un petit jeu en ligne où un ami doit deviner un nombre secret. Tu veux lui donner un retour, mais sans dévoiler la réponse à travers une proposition. Tu dois donc concevoir une fonction qui produit des réponses différentes selon la façon dont la proposition se situe par rapport au nombre secret.

Condition Réponse
Quand la proposition correspond au nombre secret "Correct"
Quand la proposition vaut un de plus ou un de moins que le nombre secret "So close"
Quand la proposition est supérieure au nombre secret "Too high"
Quand la proposition est inférieure au nombre secret "Too low"
Quand aucune proposition n'est faite "Make a guess"

Toutes les propositions et tous les nombres secrets sont des nombres entiers.

1. Produis la réponse quand la proposition correspond au nombre secret

Implémente la fonction compare/2 qui prend deux arguments, secret_number et guess, tous deux des nombres entiers.

GuessingGame.compare(5, 5)
# => "Correct"

2. Produis la réponse quand la proposition est supérieure au nombre secret

Modifie la fonction compare pour qu'elle réponde aux propositions supérieures au nombre secret.

GuessingGame.compare(5, 8)
# => "Too high"

3. Produis la réponse quand la proposition est inférieure au nombre secret

Modifie la fonction compare pour qu'elle réponde aux propositions inférieures au nombre secret.

GuessingGame.compare(5, 2)
# => "Too low"

4. Produis les réponses quand la proposition vaut un de plus ou un de moins que le nombre secret

Modifie la fonction compare pour qu'elle réponde aux propositions proches du nombre secret.

GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"

5. Produis la réponse quand il n'y a pas de proposition

Modifie la fonction compare pour qu'elle réponde à l'absence de proposition.

GuessingGame.compare(5)
# => "Make a guess"

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elixir Exercism

Prêt à commencer Jeu de devinettes ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.