Tracks
/
F#
F#
/
Übungen
/
Schatzsuche in Tisbury
Schatzsuche in Tisbury

Schatzsuche in Tisbury

Lernübung

Einführung

Tupel

Ein Tupel ist eine unveränderliche Gruppierung unbenannter, aber geordneter Werte. Ein Tupel kann beliebige (oder auch mehrere) Datentypen enthalten, einschließlich anderer Tupel.

Ein Tupel wird als kommagetrennte Folge von Werten zwischen den Zeichen ( und ) definiert: (<element_1>, ... , <element_n>).

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

Nur Tupel mit derselben Länge und denselben Typen (in derselben Reihenfolge) lassen sich vergleichen. Tupel besitzen strukturelle Gleichheit. Das bedeutet, sie sind nur dann gleich, wenn alle ihre Werte gleich sind.

(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

Es gibt drei Möglichkeiten, Werte aus einem Tupel zu extrahieren:

  • Die Funktionen fst und snd
  • Die Dekonstruktion von Tupeln
  • Pattern Matching
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

Anleitung

Azara und Rui sind Teamkollegen und nehmen an einer Schatzsuche im Piratenstil teil. Die eine hat eine Liste mit Schätzen und ihren Kartenkoordinaten, der andere eine Liste mit Ortsnamen und ihren Kartenkoordinaten. Außerdem haben sie leere Karten bekommen, auf denen ein Startpunkt mit DU BIST HIER markiert ist.

Azaras Liste Ruis Liste
Treasure Coordinates
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
Location Name Coordinates Quandrant
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

Doch die Sache ist etwas unübersichtlich: Azaras Koordinaten scheinen anders formatiert und sortiert zu sein als die von Rui, und sie müssen ständig von der einen Liste zur anderen schauen, um herauszufinden, welche Schätze zu welchen Orten gehören. Da sie angehende F#-Fans sind, bitten sie dich um Hilfe: Du sollst ein kleines Programm schreiben (genauer gesagt ein paar Funktionen), mit dem sie ihre Jagdinformationen besser organisieren können.

1. Koordinaten extrahieren

Implementiere die Funktion getCooordinate(), die ein Paar (treasure, coordinate) aus Azaras Liste entgegennimmt und nur die extrahierte Kartenkoordinate zurückgibt.

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

2. Koordinaten formatieren

Implementiere die Funktion convertCoordinate(), die eine Koordinate im Format „2A“ entgegennimmt und ein Tupel im Format (2, 'A') zurückgibt.

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

3. Koordinaten abgleichen

Implementiere die Funktion compareRecords(), die ein Paar (treasure, coordinate) und einen Record (location, coordinate, quadrant) entgegennimmt und die Koordinaten aus beiden vergleicht. Gib true zurück, wenn die Koordinaten „übereinstimmen“, und false, wenn nicht. Formatiere die Koordinaten bei Bedarf neu, um sie korrekt vergleichen zu können.

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. Übereinstimmende Records zusammenführen

Implementiere die Funktion createrecord(), die ein Paar (treasure, coordinate) aus Azaras Liste und einen Record (location, coordinate, quadrant) aus Ruis Liste entgegennimmt und (coordinate, location, quadrant, treasure) zurückgibt, sofern die Koordinaten übereinstimmen. Wenn die Koordinaten nicht übereinstimmen, gib ein Tupel derselben Form zurück, aber mit "" gefüllt. Formatiere die Koordinaten bei Bedarf neu, um sie korrekt vergleichen zu können.

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

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
F# Exercism

Bereit, mit Schatzsuche in Tisbury zu starten?

Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.