Parcours
/
F#
F#
/
Exercices
/
La chasse au trésor de Tisbury
La chasse au trésor de Tisbury

La chasse au trésor de Tisbury

Exercice d'apprentissage

Introduction

Tuples

Un tuple est un groupement immuable de valeurs non nommées mais ordonnées. Les tuples peuvent contenir n'importe quel type de données (ou plusieurs types de données), y compris d'autres tuples.

Les tuples sont définis comme des valeurs séparées par des virgules entre les caractères ( et ) : (<element_1>, ... , <element_n>).

("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)

Seuls les tuples ayant la même longueur et les mêmes types (dans le même ordre) peuvent être comparés. Les tuples ont une égalité structurelle, ce qui signifie qu'ils sont égaux seulement si toutes leurs valeurs sont égales.

(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true

(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false

(1, 2) = (1, "2") // Same length, different types
// compiler error

(1, 2) = (1, 2, 3) // Different length
// compiler error

Il existe trois façons d'extraire des valeurs d'un tuple :

  • Les fonctions fst et snd
  • La déconstruction de tuple
  • Le filtrage par motif
let person = ("Jordan", 170)

// Option 1: fst/snd
let name1 = fst person
let length2 = snd person

// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170

// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3

Instructions

Azara et Rui sont coéquipiers dans une chasse au trésor sur le thème des pirates. L'un a une liste de trésors avec leurs coordonnées sur la carte, l'autre une liste de noms de lieux avec leurs coordonnées. On leur a aussi donné des cartes vierges avec un point de départ marqué YOU ARE HERE.

Liste d'Azara Liste de Rui
Trésor Coordonnées
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshaw Whale's Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Nom du lieu Coordonnées Quadrant
Seaside Cottages (1, 'C') Blue
Aqua Lagoon (Island of Mystery) (1, 'F') Yellow
Deserted Docks (2, 'A') Blue
Spiky Rocks (3, 'D') Yellow
Abandoned Lighthouse (4, 'B') Blue
Hidden Spring (Island of Mystery) (4, 'E') Yellow
Stormy Breakwater (5, 'B') Purple
Old Schooner (6, 'A') Purple
Tangled Seaweed Patch (6, 'D') Orange
Quiet Inlet (Island of Mystery) (7, 'E') Orange
Windswept Hilltop (Island of Mystery) (7, 'F') Orange
Harbor Managers Office (8, 'A') Purple
Foggy Seacave (8, 'C') Purple

Mais tout est un peu désorganisé : les coordonnées d'Azara semblent avoir un format et un tri différents de ceux de Rui, et ils doivent sans cesse passer d'une liste à l'autre pour déterminer quels trésors vont avec quels lieux. Comme ils se lancent tout juste en F#, ils viennent te demander de l'aide pour écrire un petit programme (un ensemble de fonctions, en fait) afin de mieux organiser les informations de leur chasse.

1. Extrais les coordonnées

Implémente la fonction getCooordinate() qui prend une paire (treasure, coordinate) de la liste d'Azara et renvoie uniquement la coordonnée extraite sur la carte.

getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"

2. Formate les coordonnées

Implémente la fonction convertCoordinate() qui prend une coordonnée au format "2A" et renvoie un tuple au format (2, 'A').

convertCoordinate "2A"
// (2, 'A')

3. Fais correspondre les coordonnées

Implémente la fonction compareRecords() qui prend une paire (treasure, coordinate) et un enregistrement (location, coordinate, quadrant) et compare leurs coordonnées respectives. Renvoie true si les coordonnées « correspondent », et renvoie false sinon. Reformate les coordonnées si nécessaire pour que la comparaison soit exacte.

compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false

compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true

4. Combine les enregistrements correspondants

Implémente la fonction createrecord() qui prend une paire (treasure, coordinate) de la liste d'Azara et un enregistrement (location, coordinate, quadrant) de la liste de Rui et renvoie (coordinate, location, quadrant, treasure) si les coordonnées correspondent. Si les coordonnées ne correspondent pas, renvoie un tuple de même forme mais rempli de "". Reformate les coordonnées si nécessaire pour que la comparaison soit exacte.

createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
F# Exercism

Prêt à commencer La chasse au trésor de Tisbury ?

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