Tracks
/
Elm
Elm
/
Übungen
/
Schatzsuche in Tisbury
Schatzsuche in Tisbury

Schatzsuche in Tisbury

Lernübung

Einführung

Tupel

Tupel in Elm können zwei oder drei Werte enthalten, und jeder Wert kann einen beliebigen Typ haben. In Elm werden Tupel meist für einfache, kurzlebige Typen verwendet. Deshalb haben Tupel höchstens 3 Werte, und um das noch zu unterstreichen, gibt es Komfortfunktionen nur für 2 Werte. Für komplexere Daten wechselst du am besten zu 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"

Tupel lassen sich in Bindungen mithilfe von Musterabgleich destrukturieren. Destrukturieren ist in let-Ausdrücken, Funktionsdeklarationen und case-Anweisungen möglich.

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

Anleitung

Aazra und Rui entwerfen eine Schatzsuche mit Piratenmotiv. Die eine Liste enthält Schätze mit ihren Positionen auf der Karte, die andere Ortsnamen mit ihren Positionen auf der Karte.

Schatz Position
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)
Ortsname Position 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

Die Spieler reisen über die Karte und sammeln unterwegs Schätze ein. Die Positionen von Schätzen und von Orten sind unterschiedlich formatiert, damit es eine zusätzliche Herausforderung gibt. Außerdem gibt es einige besondere Orte, an denen bestimmte Schätze gegen bestimmte andere getauscht werden können, um dem Spiel eine zusätzliche Wendung zu geben. Deine Aufgabe ist es, Funktionen zu schreiben, die ihnen bei ihrem Spiel helfen.

1. Positionen umwandeln

Implementiere die Funktion placeLocationToTreasureLocation. Sie nimmt eine Orts-Position (zum Beispiel ('C', 1)) und wandelt sie in eine Schatz-Position (zum Beispiel (1, 'C')) um.

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

2. Schatz- und Orts-Positionen vergleichen

Implementiere die Funktion treasureLocationMatchesPlaceLocation. Sie nimmt eine PlaceLocation (zum Beispiel ('C', 1)) und gibt wahr zurück, wenn sie zu einer TreasureLocation (zum Beispiel (1, 'C')) passt.

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

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

3. Schatz-Positionen zählen

Implementiere die Funktion countPlaceTreasures. Sie nimmt einen Ort (zum Beispiel ("Aqua Lagoon (Island of Mystery)", ('F', 1))) und die Liste der Schätze und gibt die Anzahl der Schätze zurück, die dort zu finden sind.

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

countPlaceTreasures place treasures =
--> 2

4. Besondere Orte

Implementiere die Funktion specialCaseSwapPossible. Sie nimmt einen Schatz (zum Beispiel ("Amethyst Octopus", (1, 'F'))) und einen Ort (zum Beispiel ("Seaside Cottages ", ('C', 1))) und gibt für die folgenden Kombinationen wahr zurück:

  • Der Brass Spyglass kann am Abandoned Lighthouse gegen jeden anderen Schatz getauscht werden
  • Der Amethyst Octopus kann am Stormy Breakwater gegen den Crystal Crab oder den Glass Starfish getauscht werden
  • Der Vintage Pirate Hat kann im Harbor Managers Office gegen das Model Ship in Large Bottle oder die Antique Glass Fishnet Float getauscht werden

Versuche, diese Funktion als case-Anweisung mit einem Ad-hoc-Tupel zu implementieren, statt if-Anweisungen zu verwenden (das ist ein gängiges Idiom in Elm).

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elm Exercism

Bereit, mit Schatzsuche in Tisbury zu starten?

Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.