Tracks
/
Julia
Julia
/
Übungen
/
Schatzsuche in Tisbury
Schatzsuche in Tisbury

Schatzsuche in Tisbury

Lernübung

Einführung

Ein Tuple ähnelt einem Vector (eindimensionales array) in vielerlei Hinsicht. Es gibt jedoch ein paar wichtige Unterschiede.

  • Tupel werden in runden Klammern ( ) geschrieben, nicht in eckigen Klammern [ ]. Die Klammern kannst du allerdings weglassen, wenn die Bedeutung eindeutig ist.
  • Tupel müssen nicht homogen sein: Der Typ jedes Elements wird unabhängig gespeichert.
  • Tupel sind unveränderlich.

Unveränderlichkeit erlaubt dem Compiler mehr Optimierungen und macht Tupel leistungsfähiger als Vektoren. Deshalb solltest du sie bevorzugen, wenn keine Veränderbarkeit nötig ist.

julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")

# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
  1: Int64 3
  2: Float64 5.2
  3: String "xyz"

julia> t[2]
5.2

# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})

Es gibt außerdem einen Tuple()-Konstruktor, der jede iterierbare Sammlung in ein Tupel umwandelt. Praktischerweise behandelt er einen String als iterierbare Sammlung von Zeichen.

julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')

Bei jedem Tupel kannst du auf die Elemente über den Index zugreifen oder sie in einer Schleife durchlaufen.

Jedes rein numerische Tupel kannst du auch in mathematischen Funktionen wie sum() verwenden, genau wie Arrays.

Entpacken

Ein Tupel lässt sich mit Mehrfachzuweisung in einzelne Elemente entpacken. Für Elemente, die du nicht brauchst, verwendest du den Unterstrich _ als Platzhaltervariable.

julia> tup = (1, "Julia", true)
(1, "Julia", true)

julia> num, name, _ = tup
(1, "Julia", true)

julia> uppercase(name), 2num
("JULIA", 2)

Wer Python programmiert, kennt diese Syntax der Mehrfachzuweisung schon gut.

Benannte Tupel

Ein Tuple enthält nur Werte. Ein NamedTuple kombiniert jeden Wert mit einem Namen.

Auf die einzelnen Felder kannst du dann mit der Punkt-Notation zugreifen:

julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)

julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
  a: Int64 1
  b: Float64 7.3

julia> nt.b
7.3

Der Name wird intern als Symbol gespeichert (ein unveränderlicher Typ mit einem Doppelpunkt : als Präfix), deshalb gibt es noch eine alternative Syntax:

julia> nt[:b]
7.3

Es ist einfach, entweder nur die Namen (auch „Schlüssel“ genannt) oder nur die Werte zu bekommen:

julia> nt
(a = 1, b = 7.3)

julia> keys(nt)
(:a, :b)

julia> values(nt)
(1, 7.3)

Beachte, dass eine Iteration über ein benanntes Tupel nur die Werte liefert und die Namen ignoriert werden.

Tupel (benannt oder nicht) sind ein sehr verbreiteter Weg, strukturierte Daten an Funktionen zu übergeben und von ihnen zurückzubekommen. Unveränderlichkeit ist in diesem Fall von Vorteil: Sie sorgt für Datensicherheit und ermöglicht dem Compiler aggressivere Optimierungen.

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 Kartenkoordinaten. Außerdem haben beide leere Karten bekommen, auf denen der 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 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

Doch die Sache ist ein wenig unordentlich: Azaras Koordinaten scheinen anders formatiert und sortiert zu sein als die von Rui, und die beiden müssen ständig von der einen Liste zur anderen schauen, um herauszufinden, welche Schätze zu welchen Orten gehören. Da sie angehende Julia-Programmierer sind, kommen sie zu dir und bitten um Hilfe beim Schreiben eines kleinen Programms (genauer gesagt einer Reihe von Funktionen), mit dem sie ihre Informationen zur Schatzsuche besser ordnen können.

1. Koordinaten extrahieren

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

julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"

2. Koordinaten formatieren

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

julia> convert_coordinate("2A")
('2', 'A')

3. Koordinaten abgleichen

Implementiere die Funktion compare_records(), die ein Paar (treasure, coordinate) und einen Datensatz (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, damit der Vergleich genau ist.

julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false

julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true

4. Übereinstimmende Datensätze zusammenführen

Implementiere die Funktion create_record(), die ein Paar (treasure, coordinate) aus Azaras Liste und einen Datensatz (location, coordinate, quadrant) aus Ruis Liste entgegennimmt und (coordinate, location, quadrant, treasure) zurückgibt, wenn die Koordinaten übereinstimmen.

Wenn die Koordinaten nicht übereinstimmen, gib ein leeres Tupel zurück. Formatiere die Koordinaten bei Bedarf neu, damit der Vergleich genau ist.

julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Julia Exercism

Bereit, mit Schatzsuche in Tisbury zu starten?

Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.