Parcours
/
F#
F#
/
Exercices
/
Observateur d'oiseaux
Observateur d'oiseaux

Observateur d'oiseaux

Exercice d'apprentissage

Introduction

Tableaux

Un array en F# est une collection modifiable de zéro ou plusieurs valeurs et de longueur fixe. Cela signifie qu'une fois qu'un tableau a été créé, sa taille ne peut plus changer, mais que ses valeurs, elles, peuvent être modifiées. Toutes les valeurs d'un tableau doivent avoir le même type. Les tableaux peuvent être définis comme suit :

let empty = [| |]
let emptyAlternative = Array.empty

let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5

let threeValues = [| "a"; "b"; "c" |]

On peut affecter une valeur à un élément d'un tableau ou récupérer cet élément à l'aide d'un indice. Les tableaux F# sont indexés à partir de zéro, ce qui signifie que l'indice du premier élément est toujours zéro :

let numbers = [| 2; 3; 5 |]

// Update value in array
numbers[2] <- 9

// Read value from array
numbers[2]
// => 9

Les tableaux sont soit manipulés par des fonctions et des opérateurs définis dans le module Array, soit manuellement par correspondance de motifs, avec le motif tableau :

let describe array =
    match array with
    | [| |] -> "Empty"
    | [| 1; 2; three |] -> sprintf "1, 2, %d" three
    | _ -> "Other"

describe [| |]         // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"

On peut aussi ignorer une valeur lors d'une correspondance de motifs ; quand on ne se soucie pas d'une valeur dans un cas précis (c'est-à-dire qu'on ne va pas utiliser cette valeur), on peut utiliser un tiret bas ('_') pour l'indiquer :

let describe array =
    match array with
    | [| |] -> "Empty array"
    | [| x |] -> "Array with one item"
    | [| _; y |] -> "Array with two items (first item ignored)"
    | _ -> "Array with many items (all items ignored)"

describe [| |]          // => "Empty array"
describe [| 1 |]        // => "Array with one item"
describe [| 5; 7 |]     // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |]  // => "Array with many items (all items ignored)"

Le '_' seul doit toujours venir en dernier lors d'une correspondance de motifs ; toute valeur qui ne correspond à aucun des autres cas sera traitée par ce cas.

Instructions

Tu es un passionné d'observation des oiseaux qui note combien d'oiseaux ont visité ton jardin ces sept derniers jours.

Tu as six tâches, toutes portant sur le nombre d'oiseaux qui ont visité ton jardin.

1. Vérifie quels étaient les comptages de la semaine dernière

Pour pouvoir comparer, tu gardes toujours une copie des comptages de la semaine dernière à portée de main, qui étaient : 0, 2, 5, 3, 7, 8 et 4. Définis la liaison lastWeek qui contient les comptages de la semaine dernière :

lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]

2. Vérifie combien d'oiseaux sont venus hier

Implémente la fonction yesterday pour qu'elle renvoie le nombre d'oiseaux qui ont visité ton jardin hier. Les comptages d'oiseaux sont ordonnés par jour, le premier élément étant le comptage du jour le plus ancien et le dernier celui d'aujourd'hui.

yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4

3. Calcule le nombre total d'oiseaux visiteurs

Implémente la fonction total pour qu'elle renvoie le nombre total d'oiseaux qui ont visité ton jardin :

total [| 3; 5; 0; 7; 4; 1 |]
// => 20

4. Vérifie s'il y a eu un jour sans aucun oiseau

Implémente la fonction dayWithoutBirds qui renvoie true s'il y a eu un jour où aucun oiseau n'a visité le jardin ; sinon, elle renvoie false :

dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true

5. Incrémente le comptage d'aujourd'hui

Implémente la fonction incrementTodaysCount pour incrémenter le comptage d'aujourd'hui et renvoyer les comptages mis à jour :

let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]

6. Vérifie si la semaine est inhabituelle

Au cours de l'année écoulée, tu as remarqué que certaines semaines présentent les mêmes motifs inhabituels :

  • Les jours pairs de la semaine, il n'y avait aucun oiseau
  • Les jours pairs de la semaine, exactement 10 oiseaux ont été observés
  • Les jours impairs de la semaine, exactement 5 oiseaux ont été observés

Implémente la fonction unusualWeek qui renvoie true si le motif de comptage d'oiseaux de cette semaine correspond à l'un des motifs inhabituels :

unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true

unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true

(Note que la parité des jours est indexée à partir de 1, et non de 0 : le premier élément du tableau correspond à un jour impair)

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
F# Exercism

Prêt à commencer Observateur d'oiseaux ?

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