Parcours
/
F#
F#
/
Exercices
/
Jeu de devinettes
Jeu de devinettes

Jeu de devinettes

Exercice d'apprentissage

Introduction

Filtrage par motif

Une expression if/elif/else permet d'exécuter de la logique de façon conditionnelle. F# propose également une autre façon, plus puissante, d'exécuter de la logique de façon conditionnelle : le filtrage par motif. Avec le filtrage par motif, on peut tester une valeur par rapport à un ou plusieurs motifs. Un exemple d'un tel motif est le motif constant, qui compare une valeur à une constante (par exemple 1 ou "hello").

En F#, le filtrage par motif se fait à l'aide du mot-clé match :

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

Même si cela peut ressembler à des instructions switch dans 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 de capturer une valeur :

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

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

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

Dans l'exemple ci-dessus, il n'y a pas forcément de motif correspondant pour toutes les entrées possibles. Le compilateur le détecte et émet un avertissement. C'est ce qu'on appelle la vérification d'exhaustivité. Pour faire disparaître l'avertissement, il faut gérer tous les cas. Pour cela, on peut utiliser le motif joker, qui correspond à n'importe quelle valeur :

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Le filtrage par motif teste une valeur par rapport à chaque motif, de haut en bas, jusqu'à ce qu'il trouve un motif correspondant et exécute la logique associée à ce motif. L'ordre des motifs compte !

Instructions

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

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

Quatre tâches t'attendent pour coder les réponses aux propositions.

1. Réponds à une proposition correcte

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

reply 42
// => "Correct"

2. Réponds à une proposition proche

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

reply 41
// => "So close"

3. Réponds aux propositions trop basses

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

reply 25
// => "Too low"

4. Réponds aux propositions trop hautes

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

reply 88
// => "Too high"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
F# Exercism

Prêt à commencer Jeu de devinettes ?

Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.