مسیرها
/
Python
Python
/
تمرین‌ها
/
شکار گنج تیسبری
شکار گنج تیسبری

شکار گنج تیسبری

تمرین یادگیری

مقدمه

در Python، یک تاپل مجموعه‌ای تغییرناپذیر از عنصرها به‌صورت دنباله‌ای است. مانند بیشتر مجموعه‌ها، tuples می‌توانند هر نوع داده‌ای (یا چند نوع داده) را در خود نگه دارند، از جمله tuplesهای دیگر. تاپل‌ها همه‌ی عملیات رایج دنباله را پشتیبانی می‌کنند، اما عملیات دنباله‌ی تغییرپذیر را پشتیبانی نمی‌کنند.

می‌توان روی عنصرهای یک تاپل با ساختار for item in <tuple> پیمایش کرد. اگر هم اندیس عنصر و هم مقدار آن لازم باشد، می‌توان از for index, item in enumerate(<tuple>) استفاده کرد. مانند هر دنباله، می‌توان به عنصرهای داخل tuples با نماد کروشه و با یک شماره‌ی 0-based index از سمت چپ یا یک شماره‌ی -1-based index از سمت راست دسترسی پیدا کرد. همچنین می‌توان تاپل‌ها را به‌طور کامل یا بخشی با نماد برش (<tuple>[<start>:<stop>:<step>]) کپی کرد.

ساخت تاپل

تاپل‌ها را می‌توان به روش‌های گوناگون ساخت، یا با سازنده‌ی کلاس tuple(<iterable>) یا با اعلان تحت‌اللفظی tuple.

استفاده از سازنده‌ی tuple() به‌صورت خالی یا با یک تکرارپذیر:

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

رشته‌ها تکرارپذیرند، بنابراین استفاده از یک str تنها به‌عنوان آرگومان سازنده‌ی tuple() می‌تواند نتیجه‌های غافلگیرکننده‌ای داشته باشد:

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

عنصرهای یک تکرارپذیر یکی‌یکی اضافه می‌شوند:

>>> 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(<iterable>) تنها تکرارپذیرها (یا هیچ چیز) را به‌عنوان آرگومان می‌پذیرد، ساختن یک تاپل تک‌عنصری با روش تحت‌اللفظی بسیار آسان‌تر است.

>>> no_elements = ()
()

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

ساختارهای داده‌ی تودرتو را می‌توان به‌عنوان عنصرهای tuple گنجاند، از جمله tuplesهای دیگر:

>>> 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 را باز می‌کند و یک tuple تازه‌ی ترکیب‌شده می‌سازد.

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

دسترسی به عنصرهای داخل یک تاپل

می‌توان به عنصرهای داخل یک tuple با نماد کروشه و با یک شماره‌ی 0-based index از سمت چپ یا یک شماره‌ی -1-based index از سمت راست دسترسی پیدا کرد.

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

پیمایش عنصرهای یک تاپل

می‌توان عنصرهای داخل یک tuple را در یک حلقه با ساختار for item in <tuple> پیمایش کرد. اگر هم اندیس‌ها و هم مقادیر لازم باشند، می‌توان از for index, item in enumerate(<tuple>) استفاده کرد.

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

بررسی عضویت در یک تاپل

می‌توان از عملگر in برای بررسی عضویت در یک tuple استفاده کرد.

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

>>> "Parrot" in multiple_elements_list
True

دستورالعمل‌ها

آزارا و رویی هم‌تیمی هستند و در یک شکار گنج با حال‌وهوای دزدان دریایی با هم رقابت می‌کنند. یکی فهرستی از گنج‌ها با مختصات نقشه دارد و دیگری فهرستی از نام مکان‌ها با مختصات نقشه. نقشه‌های خالی‌ای هم به آنها داده شده که محل شروع رویشان با «شما اینجا هستید» مشخص شده است.


فهرست آزارا فهرست رویی
گنج مختصات
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
نام مکان مختصات ربع
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

اما اوضاع کمی به‌هم‌ریخته است: به نظر می‌رسد مختصات آزارا با مختصات رویی متفاوت قالب‌بندی و مرتب شده‌اند و آنها باید مدام از یک فهرست به فهرست دیگر نگاه کنند تا بفهمند کدام گنج‌ها با کدام مکان‌ها جور درمی‌آیند. از آنجا که پایتونیست‌های تازه‌کار هستند، برای کمک در نوشتن یک برنامه‌ی کوچک (در واقع مجموعه‌ای از توابع) به سراغ شما آمده‌اند تا اطلاعات شکارشان را بهتر سازمان‌دهی کنند.

1. استخراج مختصات

تابع get_coordinate() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) از فهرست آزارا می‌گیرد و فقط مختصات نقشه‌ی استخراج‌شده را برمی‌گرداند.

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

2. قالب‌بندی مختصات

تابع convert_coordinate() را پیاده‌سازی کنید که مختصاتی در قالب "2A" می‌گیرد و یک تاپل در قالب ("2", "A") برمی‌گرداند.

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

3. تطبیق مختصات

تابع compare_records() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) و یک رکورد (location, coordinate, quadrant) می‌گیرد و مختصات هرکدام را با هم مقایسه می‌کند. اگر مختصات جور دربیایند True را برگردانید و اگر جور درنیایند False را برگردانید. برای مقایسه‌ی دقیق، مختصات را در صورت نیاز دوباره قالب‌بندی کنید.

>>> 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. ترکیب رکوردهای منطبق

تابع create_record() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) از فهرست آزارا و یک رکورد (location, coordinate, quadrant) از فهرست رویی می‌گیرد و اگر مختصات جور دربیایند (treasure, coordinate, location, coordinate, quadrant) را برمی‌گرداند. اگر مختصات جور درنیایند، رشته‌ی «not a match» را برگردانید. مختصات را در صورت نیاز دوباره قالب‌بندی کنید تا مقایسه دقیق باشد.

>>> 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. «مرتب‌سازی» و تهیه‌ی گزارشی از همه‌ی رکوردها

رکوردهای ترکیب‌شده‌ی آزارا و رویی را مرتب کنید تا برای هر رکورد فقط یک مجموعه مختصات بماند. گزارشی تهیه کنید تا بتوانند فهرست واحدی از همه‌ی آنچه را که باید روی نقشه‌هایشان بگذارند ببینند. تابع clean_up() را پیاده‌سازی کنید که یک تاپل از تاپل‌ها (همه‌ی داده‌های هر دو فهرست) می‌گیرد، تاپل بیرونی را پیمایش می‌کند، مختصات ناخواسته را از هر تاپل داخلی حذف می‌کند و هرکدام را به یک «گزارش» اضافه می‌کند. «گزارش» را طوری قالب‌بندی و برگردانید که در هر خط یک رکورد مرتب‌شده قرار بگیرد.

>>> 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
"""
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

آماده‌اید شکار گنج تیسبری را شروع کنید؟

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.