المسارات
/
Python
Python
/
التمارين
/
البحث عن الكنز في Tisbury
البحث عن الكنز في Tisbury

البحث عن الكنز في Tisbury

تمرين تعلّمي

مقدمة

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

التعليمات

آزارا وروي زميلان في فريق يتنافسان في مسابقة للبحث عن الكنز بطابع القراصنة. إحداهما لديها قائمة بالكنوز مع إحداثياتها على الخريطة، والأخرى لديها قائمة بأسماء المواقع مع إحداثياتها على الخريطة. وقد حصلتا أيضًا على خرائط فارغة تحمل علامة لنقطة البداية مكتوب عليها «أنت هنا».


قائمة آزارا قائمة روي
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
Scrimshawed Whale 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

لكن الأمور غير منظمة بعض الشيء: يبدو أن إحداثيات آزارا منسّقة ومرتبة بشكل مختلف عن إحداثيات روي، وعليهما مواصلة التنقل بين القائمتين لمعرفة أي الكنوز تنتمي إلى أي المواقع. وبما أنهما من محبي Python الناشئين، فقد لجآ إليك طلبًا للمساعدة في كتابة برنامج صغير (مجموعة دوال في الحقيقة) لتنظيم معلومات رحلة البحث بشكل أفضل.

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

مستعد لبدء البحث عن الكنز في Tisbury؟

سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.