Kurzusok
/
Julia
Julia
/
Feladatok
/
Tisbury kincsvadászata
Tisbury kincsvadászata

Tisbury kincsvadászata

Tanulófeladat

Bevezetés

A Tuple sok szempontból nagyon hasonlít a Vector-hoz (egydimenziós array). Néhány fontos különbség azonban van.

  • A tuple-okat kerek zárójel ( ) közé írjuk szögletes zárójel [ ] helyett, bár a kerek zárójel elhagyható, ha a jelentés egyértelmű.
  • A tuple-oknak nem kell homogénnek lenniük: minden elem típusát külön tárolja.
  • A tuple-ok módosíthatatlanok.

A módosíthatatlanság miatt a fordító több optimalizálást tud végezni, és a tuple-ok gyorsabbak a vektoroknál, ezért érdemes előnyben részesíteni őket, amikor nincs szükség módosíthatóságra.

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})

Létezik egy Tuple() konstruktor is, amely bármilyen bejárható gyűjteményt tuple-vá alakít. Hasznos módon a stringet karakterek bejárható gyűjteményeként kezeli.

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

Bármelyik tuple esetében hozzáférhetsz az elemekhez index alapján, vagy végigmehetsz rajtuk egy ciklussal.

Bármelyik tisztán numerikus tuple használható matematikai függvényekben, például a sum() esetében is, pontosan úgy, mint a tömbök.

Kicsomagolás

Egy tuple kicsomagolható az egyes elemeire többes értékadással. A nem szükséges elemek helyére írj aláhúzásjelet _ dummy változóként.

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

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

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

A Python-programozók számára ez a többes értékadásos szintaxis nagyon ismerős lesz.

Nevesített tuple-ok

A Tuple csak értékeket tartalmaz. A NamedTuple minden értékhez hozzárendel egy nevet.

Az egyes mezők ezután »pont« jelöléssel érhetők el:

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

A nevet a rendszer belül Symbol típusként tárolja (módosíthatatlan típus, kettőspont : előtaggal), ezért egy alternatív szintaxis is elérhető:

julia> nt[:b]
7.3

Könnyen hozzájuthatsz külön a nevekhez (más néven »kulcsok«) vagy az értékekhez:

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

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

julia> values(nt)
(1, 7.3)

Vedd figyelembe, hogy egy nevesített tuple bejárása csak az értékeket adja, a neveket figyelmen kívül hagyja.

A tuple-ok (akár nevesítettek, akár nem) nagyon gyakori módjai a strukturált adatok függvényekhez való átadásának és visszavételének. Ebben a felhasználási esetben a módosíthatatlanság előnyös: adatbiztonságot nyújt, és agresszívabb fordítói optimalizálást tesz lehetővé.

Utasítások

Azara és Rui csapattársak, akik egy kalóztémájú kincsvadászaton versenyeznek. Az egyiküknél a kincsek listája van térképkoordinátákkal, a másikuknál a helyszínnevek listája térképkoordinátákkal. Kaptak üres térképeket is, amelyeken a kiindulópont „ITT VAGY” felirattal van megjelölve.

Azara listája Rui listája
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

A dolgok azonban kissé rendezetlenek: úgy tűnik, Azara koordinátái másképp vannak formázva és rendezve, mint Ruiéi, és folyton egyik listáról a másikra kell pillantaniuk, hogy kitalálják, melyik kincs melyik helyszínhez tartozik. Mivel feltörekvő Julia-programozók, hozzád fordultak segítségért, hogy írj egy kis programot (valójában függvények egy csoportját), amivel jobban rendszerezhetik a vadászathoz tartozó információikat.

1. Koordináták kinyerése

Valósítsd meg a get_cooordinate() függvényt, amely egy (treasure, coordinate) párt vesz át Azara listájáról, és csak a kinyert térképkoordinátát adja vissza.

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

2. Koordináták formázása

Valósítsd meg a convert_coordinate() függvényt, amely egy „2A” formátumú koordinátát vesz át, és egy ('2', 'A') formátumú tuple-t ad vissza.

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

3. Koordináták összevetése

Valósítsd meg a compare_records() függvényt, amely egy (treasure, coordinate) párt és egy (location, coordinate, quadrant) rekordot vesz át, és összehasonlítja a kettő koordinátáit. Add vissza a true értéket, ha a koordináták „egyeznek”, és a false értéket, ha nem. Formázd újra a koordinátákat, ha a pontos összehasonlításhoz szükséges.

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. Az egyező rekordok összekapcsolása

Valósítsd meg a create_record() függvényt, amely egy (treasure, coordinate) párt vesz át Azara listájáról és egy (location, coordinate, quadrant) rekordot Rui listájáról, és visszaadja a (coordinate, location, quadrant, treasure) értéket, ha a koordináták egyeznek.

Ha a koordináták nem egyeznek, adj vissza egy üres tuple-t. Formázd újra a koordinátákat, ha a pontos összehasonlításhoz szükséges.

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"))
()
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Tisbury kincsvadászata feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.