Track
/
Elm
Elm
/
Esercizi
/
La caccia al tesoro di Tisbury
La caccia al tesoro di Tisbury

La caccia al tesoro di Tisbury

Esercizio di apprendimento

Introduzione

Tuple

In Elm, le tuple possono contenere due o tre valori, e ogni valore può avere qualsiasi tipo. In Elm, le tuple si usano per lo più per tipi transitori semplici. Per questo motivo le tuple hanno un massimo di 3 valori e, come ulteriore incoraggiamento, le funzioni di comodo sono fornite solo per 2 valori. Per dati più complessi, è meglio passare ai record.

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"

Le tuple possono essere destrutturate nei binding usando il pattern matching sulle tuple. La destrutturazione può essere fatta nelle espressioni let, nelle dichiarazioni di funzione e nelle istruzioni 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

Istruzioni

Aazra e Rui stanno progettando una caccia al tesoro a tema pirata. C'è una lista di tesori con le posizioni sulla mappa, e un'altra lista di nomi di luoghi con le posizioni sulla mappa.

Tesoro Posizione
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)
Nome del luogo Posizione Quadrante
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

I giocatori viaggeranno sulla mappa raccogliendo tesori man mano che avanzano. Le posizioni dei tesori e dei luoghi sono formattate in modo diverso, per aggiungere una sfida in più. Ci sono anche alcuni luoghi speciali, dove certi tesori si possono scambiare con certi altri, per aggiungere un ulteriore tocco di imprevedibilità al gioco. Il tuo compito è scrivere delle funzioni per aiutarli nel loro gioco.

1. Converti le posizioni

Implementa la funzione placeLocationToTreasureLocation, che prende una posizione di un luogo (come ('C', 1)) e la converte in una posizione di un tesoro (come (1, 'C')).

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

2. Confronta le posizioni dei tesori e dei luoghi

Implementa la funzione treasureLocationMatchesPlaceLocation, che prende una PlaceLocation (come ('C', 1)) e restituisce true se corrisponde a una TreasureLocation (come (1, 'C')).

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

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

3. Conta le posizioni dei tesori

Implementa la funzione countPlaceTreasures, che prende un luogo (come ("Aqua Lagoon (Island of Mystery)", ('F', 1))) e l'array dei tesori, e restituisce il numero di tesori che si possono trovare lì.

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

countPlaceTreasures place treasures =
--> 2

4. Luoghi speciali

Implementa la funzione specialCaseSwapPossible, che prende un tesoro (come ("Amethyst Octopus", (1, 'F'))) e un luogo (come ("Seaside Cottages ", ('C', 1))), e restituisce true per le seguenti combinazioni:

  • Il Brass Spyglass può essere scambiato con qualsiasi altro tesoro all'Abandoned Lighthouse
  • L'Amethyst Octopus può essere scambiato con il Crystal Crab o il Glass Starfish allo Stormy Breakwater
  • Il Vintage Pirate Hat può essere scambiato con il Model Ship in Large Bottle o l'Antique Glass Fishnet Float all'Harbor Managers Office

Prova a implementare questa funzione come un'istruzione case con una tupla ad hoc, invece di usare istruzioni if (è un idioma comune in Elm).

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elm Exercism

Vuoi iniziare La caccia al tesoro di Tisbury?

Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.