Parcours
/
F#
F#
/
Exercices
/
Le suiveur
Le suiveur

Le suiveur

Exercice d'apprentissage

Introduction

Enregistrements

Un enregistrement est une collection de champs (qui peuvent être de types différents) qui vont ensemble. Pour définir un enregistrement, on utilise le mot-clé type. Les champs d'un enregistrement sont définis entre les caractères { et }, et chaque champ a un nom et un type. Pour créer un enregistrement, on spécifie les noms des champs et on leur affecte une valeur entre les caractères { et }. Tous les champs doivent recevoir une valeur lors de la création d'un enregistrement. On peut accéder aux valeurs des champs d'une instance d'enregistrement à l'aide de la notation avec point.

Lors de la définition ou de la création d'un enregistrement, chaque champ doit soit être sur une ligne séparée, soit être séparé par des points-virgules (;) lorsqu'il est sur une seule ligne.

// Define a record
type Address =
    { Street: string
      HouseNumber: int }

// Create a record
let oldAddress: Address =
    { Street = "Main Street"
      HouseNumber = 17 }

// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }

Comme les enregistrements sont immuables, une fois qu'un enregistrement a été construit, les valeurs de ses champs ne peuvent plus jamais changer. Si tu souhaites modifier les valeurs d'un enregistrement, le mot-clé with te permet de créer une copie d'un enregistrement existant, mais avec de nouvelles valeurs pour un ou plusieurs champs.

// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street      // => "Main Street"
newAddress.HouseNumber // => 86

Les enregistrements ont une égalité structurelle, ce qui signifie que deux instances du même enregistrement avec des valeurs identiques sont équivalentes.

En plus de pouvoir utiliser la notation avec point pour accéder aux champs d'un enregistrement, les enregistrements peuvent aussi être déconstruits dans des liaisons et dans le filtrage par motif :

let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress

match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway

Instructions

Dans cet exercice, tu es un grand fan de sport et tu viens de découvrir une passion pour le basket NBA. Comme tu débutes dans le basket NBA, tu explores en profondeur l'histoire de la NBA, en suivant les équipes, les entraîneurs et leurs statistiques de victoires et de défaites, et en les comparant entre elles.

Comme tu n'as pas encore d'équipe préférée, tu vas aussi concevoir un algorithme pour déterminer si tu dois soutenir une équipe en particulier.

Tu as sept tâches pour t'aider à développer ton propre algorithme pour soutenir une équipe.

1. Définis le modèle

Définis l'enregistrement Coach avec les deux champs suivants :

  • Name : le nom de l'entraîneur, de type string.
  • FormerPlayer : indique si l'entraîneur était un ancien joueur, de type bool.

Définis l'enregistrement Stats avec les deux champs suivants :

  • Wins : le nombre de victoires, de type int.
  • Losses : le nombre de défaites, de type int.

Définis l'enregistrement Team avec les trois champs suivants :

  • Name : le nom de l'équipe, de type string.
  • Coach : l'entraîneur de l'équipe, de type Coach.
  • Stats : les statistiques de l'équipe, de type Stats.

2. Crée l'entraîneur d'une équipe

Implémente la fonction createCoach qui prend le nom de l'entraîneur et son statut d'ancien joueur comme paramètres, et qui renvoie l'enregistrement Coach correspondant :

createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }

3. Crée les statistiques d'une équipe

Implémente la fonction createStats qui prend le nombre de victoires et le nombre de défaites comme paramètres, et qui renvoie l'enregistrement Stats correspondant :

createStats 58 24
// => { Wins = 58; Losses = 24 }

4. Crée une équipe

Implémente la fonction createTeam qui prend le nom de l'équipe, l'entraîneur et l'enregistrement des statistiques comme paramètres, et qui renvoie l'enregistrement Team correspondant :

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Larry Bird"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

5. Remplace l'entraîneur

Les propriétaires de franchises NBA étant impatients, tu as constaté que de mauvais résultats d'équipe entraînaient souvent le remplacement de l'entraîneur. Implémente la fonction replaceCoach qui prend l'équipe et son nouvel entraîneur comme paramètres, et qui renvoie l'équipe avec le nouvel entraîneur :

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record

let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

6. Vérifie s'il s'agit de la même équipe

Pendant que tu fouilles dans les statistiques, tu tiens des listes d'équipes et de leurs résultats. Il t'arrive de te tromper, et il y a alors des doublons dans ta liste. Implémente la fonction isSameTeam qui prend deux équipes et renvoie true s'il s'agit de la même équipe ; sinon, elle renvoie false :

let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats

let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats

isSameTeam pacersTeam lakersTeam
// => false

7. Vérifie si tu dois soutenir une équipe

Après avoir examiné de nombreuses équipes et de nombreux matchs, tu as mis au point un algorithme. Si l'une des conditions suivantes est vraie, tu soutiens cette équipe :

  • Le nom de l'entraîneur est « Gregg Popovich »
  • L'entraîneur est un ancien joueur
  • Le nom de l'équipe est « Chicago Bulls »
  • L'équipe a remporté 60 matchs ou plus
  • L'équipe a plus de défaites que de victoires

Implémente la fonction rootForTeam qui prend une équipe et renvoie true si tu dois soutenir cette équipe ; sinon, return false :

let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
F# Exercism

Prêt à commencer Le suiveur ?

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