Parcours
/
Gleam
Gleam
/
Exercices
/
Jeu de devinettes
Jeu de devinettes

Jeu de devinettes

Exercice d'apprentissage

Introduction

Les expressions case

En Gleam, une expression case permet d'exécuter du code de façon conditionnelle. Avec une expression case, on peut comparer une valeur à un ou plusieurs motifs. Un exemple d'un tel motif est le motif littéral, qui compare une valeur à une valeur littérale (par exemple 1 ou "hello").

Les expressions case s'écrivent avec le mot-clé case :

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

Bien que cela puisse ressembler aux instructions switch d'autres langages, le filtrage par motif révèle tout son intérêt lorsqu'on utilise aussi d'autres motifs. L'un de ces motifs est le motif de variable, qui permet d'affecter une valeur à une variable. Dans cet exemple, la variable i reçoit la valeur de number si celui-ci n'est pas 0 :

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

Dans certains cas, on peut vouloir ajouter une condition supplémentaire à un motif. C'est ce qu'on appelle une garde (clause), que l'on peut ajouter avec le mot-clé if :

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

Pour des raisons de performance, seuls les opérateurs mathématiques et booléens de base sont autorisés dans les gardes ; aucune autre fonction ne peut y être utilisée.

Dans l'exemple ci-dessus, certaines entrées possibles n'ont aucun motif correspondant. Le compilateur le détecte et produit une erreur. C'est ce qu'on appelle la vérification d'exhaustivité. Pour corriger l'avertissement, il faut gérer tous les cas. Pour cela, on peut utiliser le motif joker, un motif qui correspond à n'importe quelle valeur :

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

On peut comparer plusieurs motifs dans une même clause en les séparant par |. Une clause ne peut contenir qu'une seule garde :

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

Les expressions case comparent une valeur à chaque motif, de haut en bas, jusqu'à ce qu'elles trouvent un motif correspondant et exécutent la logique associée à ce motif. L'ordre des motifs est important !

Instructions

Dans cet exercice, tu joues avec un ami à un jeu où il faut deviner un nombre. Les règles sont simples : tu choisis secrètement un nombre entre 1 et 100, et ton ami essaie de deviner lequel. Pour aider ton ami, tu réponds différemment selon la proximité entre la supposition et le nombre que tu as choisi (42). Voici les règles pour les différentes réponses :

  • Si la supposition est 42 : « Correct »
  • Si la supposition est 41 ou 43 : « So close »
  • Si la supposition est inférieure à 41 : « Too low »
  • Si la supposition est supérieure à 43 : « Too high »

Tu as quatre tâches pour coder les réponses aux suppositions.

1. Réponds à une supposition correcte

Implémente la fonction reply pour répondre à une supposition correcte :

reply(42)
// -> "Correct"

2. Réponds à une supposition proche

Modifie la fonction reply pour répondre aux suppositions proches :

reply(41)
// -> "So close"

3. Réponds aux suppositions trop basses

Modifie la fonction reply pour répondre aux suppositions trop basses :

reply(25)
// -> "Too low"

4. Réponds aux suppositions trop hautes

Modifie la fonction reply pour répondre aux suppositions trop hautes :

reply(88)
// -> "Too high"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Gleam Exercism

Prêt à commencer Jeu de devinettes ?

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