Le suiveur

Le suiveur

Exercice d'apprentissage

Introduction

Champs étiquetés

Quand une variante de type personnalisé contient des données, on parle d'un enregistrement, et chaque valeur contenue réside dans un champ.

pub type Rectangle {
  Rectangle(
    Float, // The first field
    Float, // The second field
  )
}

Pour faciliter la lisibilité, Gleam permet d'étiqueter les champs avec un nom.

pub type Rectangle {
  Rectangle(
    width: Float,
    height: Float,
  )
}

Les étiquettes permettent de passer les arguments dans n'importe quel ordre au constructeur d'un enregistrement.

let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)

a == b
// -> True

Quand un type personnalisé ne possède qu'une seule variante, on peut utiliser la syntaxe d'accès .label pour obtenir les champs d'un enregistrement.

let rect = Rectangle(height: 10.0, width: 20.0)

rect.height // -> 10.0
rect.width  // -> 20.0

Quand un type personnalisé n'a qu'une seule variante, la syntaxe de mise à jour d'enregistrement permet de créer un nouvel enregistrement à partir d'un enregistrement existant, en remplaçant certains champs par de nouvelles valeurs.

let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)

tall_rect.height // -> 50.0
tall_rect.width  // -> 20.0

Les étiquettes servent aussi lors du filtrage par motif pour extraire des valeurs d'un enregistrement.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, width: _) if h >. 20.0 -> True
    _ -> False
  }
}

Si on ne veut filtrer que sur certains champs, on peut utiliser l'opérateur de propagation .. pour ignorer les champs restants.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, ..) if h >. 20.0 -> True
    _ -> False
  }
}

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, tu suis les équipes, les entraîneurs et leurs statistiques de victoires et de défaites, et tu les compares entre eux.

Comme tu n'as pas encore d'équipe favorite, tu vas aussi développer un algorithme pour déterminer si tu dois supporter une équipe en particulier.

Tu disposes de sept tâches pour t'aider à développer ton propre algorithme root-for-a-team.

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.
  • former_player : 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 create_coach qui prend le nom de l'entraîneur et son statut d'ancien joueur comme paramètres, et renvoie son enregistrement Coach :

create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)

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

Implémente la fonction create_stats qui prend le nombre de victoires et le nombre de défaites comme paramètres, et renvoie son enregistrement Stats :

create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)

4. Crée une équipe

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

let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Larry Bird", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

5. Remplace l'entraîneur

Les propriétaires de la 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 replace_coach qui prend l'équipe et son nouvel entraîneur comme paramètres, et renvoie l'équipe avec le nouvel entraîneur :

let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)

let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

6. Vérifie si deux équipes sont identiques

Pendant que tu explores les statistiques, tu tiens des listes d'équipes et de leurs statistiques. Parfois, tu te trompes et il y a des doublons dans ta liste. Implémente la fonction is_same_team qui prend deux équipes et renvoie True s'il s'agit de la même équipe, sinon renvoie False :

let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)

let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)

is_same_team(pacers_team, lakers_team)
// -> False

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

Après avoir étudié de nombreuses équipes et de nombreux matchs, tu as mis au point un algorithme. Si l'une des conditions suivantes est vraie, tu supportes 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 root_for_team qui prend une équipe et renvoie True si tu dois supporter cette équipe, sinon renvoie False :

let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Gleam Exercism

Prêt à commencer Le suiveur ?

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