Parcours
/
Elm
Elm
/
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

Les tuples en Elm peuvent contenir deux ou trois valeurs, et chaque valeur peut être de n'importe quel type. En Elm, les tuples servent surtout à des types transitoires simples. C'est pourquoi les tuples comportent au maximum 3 valeurs, et pour t'encourager davantage, seules des fonctions utilitaires pour 2 valeurs sont fournies. Pour des données plus complexes, il vaut mieux passer aux records.

type alias IntStringTuple = (Int, String)

aTuple : IntStringTuple
aTuple = (123, "elements can be of differing types")

anotherTuple : (String, String)
anotherTuple = Tuple.pair "this time it's" "two strings"
    --> ("this time it's", "two strings")

Tuple.first aTuple
    --> 123

Tuple.second aTuple
    --> "elements can be of differing types"

Les tuples peuvent être déstructurés dans des liaisons à l'aide du filtrage par motif de tuple. La déstructuration peut se faire dans des expressions let, des déclarations de fonction et des expressions case.

repeatString : (Int, String) -> Bool
repeatString aTuple =
let
    (aNumber, aString) = aTuple
in
    String.repeat aNumber aString

repeatStringAgain : (Int, String) -> Bool
repeatStringAgain (aNumber, aString) = String.repeat aNumber aString

has123 : (Int, String, Bool) -> Bool
has123 aTuple =
    case aTuple of
        (123, _, _) ->
            True
        (_, "123", _) ->
            True
        (_, _, True) ->
            True
        _ ->
            False

Instructions

Aazra et Rui conçoivent une chasse au trésor sur le thème des pirates. Il y a d'un côté une liste de trésors avec leurs emplacements sur la carte, et de l'autre une liste de noms de lieux avec leurs emplacements sur la carte.

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

Les joueurs parcourent la carte et ramassent des trésors en chemin. Les emplacements de trésor et de lieu ont un format différent, pour ajouter un défi supplémentaire. Il y a aussi quelques lieux spéciaux, où certains trésors peuvent être échangés contre certains autres, pour ajouter un rebondissement supplémentaire au jeu. Ta mission est d'écrire des fonctions pour les aider dans leur jeu.

1. Convertis les emplacements

Implémente la fonction placeLocationToTreasureLocation qui prend un emplacement de lieu (comme ('C', 1)) et le convertit en emplacement de trésor (comme (1, 'C')).

placeLocationToTreasureLocation ('C', 1)
--> (1,'C')

2. Compare les emplacements de trésor et de lieu

Implémente la fonction treasureLocationMatchesPlaceLocation qui prend un PlaceLocation (comme ('C', 1)) et renvoie vrai s'il correspond à un TreasureLocation (comme (1, 'C')).

treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true

treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false

3. Compte les emplacements de trésor

Implémente la fonction countPlaceTreasures, qui prend un lieu (comme ("Aqua Lagoon (Island of Mystery)", ('F', 1))) et la liste des trésors, et renvoie le nombre de trésors que l'on peut y trouver.

place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))

countPlaceTreasures place treasures =
--> 2

4. Lieux spéciaux

Implémente la fonction specialCaseSwapPossible, qui prend un trésor (comme ("Amethyst Octopus", (1, 'F'))) et un lieu (comme ("Seaside Cottages ", ('C', 1))), et renvoie vrai pour les combinaisons suivantes :

  • On peut échanger la Brass Spyglass contre n'importe quel autre trésor à l'Abandoned Lighthouse
  • On peut échanger l'Amethyst Octopus contre le Crystal Crab ou la Glass Starfish au Stormy Breakwater
  • On peut échanger le Vintage Pirate Hat contre le Model Ship in Large Bottle ou l'Antique Glass Fishnet Float au Harbor Managers Office

Essaie d'implémenter cette fonction sous la forme d'une instruction case avec un tuple ad hoc, plutôt que d'utiliser des instructions if (c'est un idiome courant en Elm).

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

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

Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.