Kurzusok
/
F#
F#
/
Feladatok
/
Tisbury kincsvadászata
Tisbury kincsvadászata

Tisbury kincsvadászata

Tanulófeladat

Bevezetés

Tuple-ök

A tuple névtelen, de rendezett értékek módosíthatatlan csoportosítása. A tuple-ök bármilyen (vagy többféle) adattípust tárolhatnak, akár más tuple-öket is.

A tuple-öket a ( és ) karakterek között álló, vesszővel elválasztott értékekként definiáljuk: (<element_1>, ... , <element_n>).

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

Csak az azonos hosszúságú és azonos típusokból (ugyanabban a sorrendben) álló tuple-ök hasonlíthatók össze. A tuple-ök szerkezeti egyenlőséggel rendelkeznek, ami azt jelenti, hogy csak akkor egyenlők, ha minden értékük egyenlő.

(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

Háromféleképpen nyerhetsz ki értékeket egy tuple-ből:

  • Az fst és snd függvények
  • Tuple-ök szétbontása
  • Mintaillesztés
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

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. Ezenkívül kaptak üres térképeket, amelyeken egy kiindulópont van megjelölve: ITT VAGY.

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

De a dolgok 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ő fsharp-osok, hozzád fordultak segítségért, hogy írj egy kis programot (valójában függvények egy csoportját), amellyel jobban rendszerezhetik a vadászat adatait.

1. Koordináták kinyerése

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

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

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

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

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

3. Koordináták egyeztetése

Valósítsd meg a compareRecords() függvényt, amely átvesz egy (treasure, coordinate) párt és egy (location, coordinate, quadrant) rekordot, majd összehasonlítja a bennük lévő koordinátákat. Add vissza a true értéket, ha a koordináták „egyeznek”, és a false értéket, ha nem. A pontos összehasonlításhoz formázd át a koordinátákat, ahogy szükséges.

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

Valósítsd meg a createrecord() függvényt, amely átvesz egy (treasure, coordinate) párt Azara listájáról és egy (location, coordinate, quadrant) rekordot Rui listájáról, majd visszaadja a (coordinate, location, quadrant, treasure) értéket, ha a koordináták egyeznek. Ha a koordináták nem egyeznek, adj vissza egy ugyanilyen alakú tuple-t, de "" értékekkel kitöltve. A pontos összehasonlításhoz formázd át a koordinátákat, ahogy szükséges.

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

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
F# Exercism

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

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