Kurzusok
/
Python
Python
/
Feladatok
/
Tisbury kincsvadászata
Tisbury kincsvadászata

Tisbury kincsvadászata

Tanulófeladat

Bevezetés

A Pythonban a tuple egy megváltoztathatatlan, sorrendben tárolt elemekből álló gyűjtemény. A legtöbb gyűjteményhez hasonlóan a tuples bármilyen (vagy többféle) adattípust tárolhat, más tuples-öket is beleértve. A tuples minden általános sorozatműveletet támogat, a módosítható sorozatműveleteket viszont nem.

A tuple elemein a for item in <tuple> szerkezettel lehet végigiterálni. Ha az elem indexére és értékére is szükség van, a for index, item in enumerate(<tuple>) használható. Mint minden sorozatnál, a tuples elemei zárójeles jelöléssel érhetők el, balról egy 0-based index számmal vagy jobbról egy -1-based index számmal. A tuple-ök egészben vagy részben szeletjelöléssel (<tuple>[<start>:<stop>:<step>]) is másolhatók.

Tuple létrehozása

A tuple-ök többféleképpen létrehozhatók: a tuple(<iterable>) osztálykonstruktorral vagy a tuple literál deklarációval.

A tuple() konstruktor használata üresen vagy iterálható argumentummal:

>>> no_elements = tuple()
()

# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)

A stringek iterálhatók, ezért ha egyetlen str-t adsz a tuple() konstruktor argumentumaként, az meglepő eredményeket hozhat:

# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')

Egyetlen iterálható elem esetén az elemek egyenként adódnak hozzá:

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Tuple deklarálása literálként:

Mivel a tuple(<iterable>) konstruktor csak iterálhatókat (vagy semmit) fogad el argumentumként, sokkal egyszerűbb egy egyelemű tuple-t a literál módszerrel létrehozni.

>>> no_elements = ()
()

>>> one_element = ("Guava",)
("Guava",)

Egymásba ágyazott adatszerkezetek is szerepelhetnek tuple elemekként, beleértve a többi tuples-t is:

>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))

>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))

Tuple-ök összefűzése

A tuple-ök összefűzhetők a plusz + operátorral, amely kibontja az egyes tuple-öket, és létrehoz egy új, egyesített tuple-t.

>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")

#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")

>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')

Elemek elérése egy tuple-ben

Egy tuple elemei zárójeles jelöléssel érhetők el, balról egy 0-based index számmal vagy jobbról egy -1-based index számmal.

student_info = ("Alyssa", "grade 3", "female", 8 )

#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'

>>> student_gender = student_info[-2]
'female'

#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa

>>> student_name = student_info[-4]
Alyssa

Végigiterálás egy tuple elemein

Egy tuple elemein ciklusban a for item in <tuple> szintaxissal lehet végigiterálni. Ha az indexekre és az értékekre is szükség van, a for index, item in enumerate(<tuple>) használható.

>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
...   print(item)

...
Alyssa
grade 3
female
8

>>> for index, item in enumerate(student_info):
...  print("Index is: " + str(index) + ", value is: " + str(item) +".")

...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.

Tagság ellenőrzése egy tuple-ben

Az in operátorral ellenőrizhető, hogy egy elem benne van-e egy tuple-ben.

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> "Parrot" in multiple_elements_list
True

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


Azara listája Rui listája
Kincs Koordináták
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
Scrimshawed Whale Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Helyszín neve Koordináták Kvadráns
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: Azara koordinátái látszólag máshogy 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ő pythonisták, 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 get_coordinate() 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.

>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A

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

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

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

3. Koordináták egyeztetése

Valósítsd meg a compare_records() 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 újra a koordinátákat, ahogy szükséges.

>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False

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

4. Egyező rekordok összevonása

Valósítsd meg a create_record() 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 (treasure, coordinate, location, coordinate, quadrant) értéket ha a koordináták egyeznek. Ha a koordináták nem egyeznek, add vissza a "not a match" szöveget. A pontos összehasonlításhoz formázd újra a koordinátát, ahogy szükséges.

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

>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"

5. „Takarítás” és jelentés készítése az összes rekordról

Tisztítsd meg Azara és Rui összevont rekordjait úgy, hogy rekordonként csak egy koordinátakészlet maradjon. Készíts jelentést, hogy egyetlen listában lássák mindazt, amit fel kell vinniük a térképeikre. Valósítsd meg a clean_up() függvényt, amely átvesz egy tuple-ökből álló tuple-t (mindent mindkét listáról), végigmegy a külső tuple-ön, elhagyja a nem kívánt koordinátákat minden egyes belső tuple-ből, és mindegyiket hozzáadja egy 'report'-hoz. Formázd és add vissza a 'report'-ot úgy, hogy minden sorban egy megtisztított rekord legyen.

>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))

"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

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

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