Διαδρομές
/
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 από τα δεξιά. Οι πλειάδες μπορούν επίσης να αντιγραφούν ολόκληρες ή εν μέρει χρησιμοποιώντας τη σημειογραφία slice (<tuple>[<start>:<stop>:<step>]).

Δημιουργία πλειάδας

Οι πλειάδες μπορούν να σχηματιστούν με πολλούς τρόπους, είτε με τον κατασκευαστή κλάσης tuple(<iterable>) είτε με τη δήλωση του literal tuple.

Χρήση του κατασκευαστή tuple() άδειου ή με ένα iterable:

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

Οι συμβολοσειρές είναι iterable, οπότε η χρήση μιας μεμονωμένης 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')

Στα μεμονωμένα iterables, τα στοιχεία προστίθενται ένα ένα:

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

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Δήλωση μιας πλειάδας ως literal :

Επειδή ο κατασκευαστής tuple(<iterable>) δέχεται ως ορίσματα μόνο iterables (ή τίποτα), είναι πολύ πιο εύκολο να δημιουργήσεις μια πλειάδα με ένα στοιχείο μέσω της μεθόδου literal.

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

Οδηγίες

Η Azara και ο Rui είναι συμπαίκτες σε ένα κυνήγι θησαυρού με πειρατική θεματολογία. Ο ένας έχει μια λίστα με θησαυρούς μαζί με τις συντεταγμένες τους στον χάρτη, και ο άλλος μια λίστα με ονόματα τοποθεσιών μαζί με τις συντεταγμένες τους στον χάρτη. Τους έχουν επίσης δώσει κενούς χάρτες, όπου ένα σημείο εκκίνησης είναι σημειωμένο με τη φράση "ΕΙΣΑΙ ΕΔΩ".


Η λίστα της Azara Η λίστα του Rui
Θησαυρός Συντεταγμένες
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

Τα πράγματα όμως είναι λίγο ακατάστατα: οι συντεταγμένες της Azara φαίνεται να έχουν διαφορετική μορφή και σειρά από του Rui, και πρέπει να κοιτάζουν συνεχώς από τη μία λίστα στην άλλη για να καταλάβουν ποιοι θησαυροί πάνε με ποιες τοποθεσίες. Καθώς είναι νέοι pythonistas, ήρθαν σε σένα για βοήθεια, ώστε να γράψουν ένα μικρό πρόγραμμα (ουσιαστικά, ένα σύνολο συναρτήσεων) που θα οργανώσει καλύτερα τις πληροφορίες του κυνηγιού τους.

1. Εξαγωγή συντεταγμένων

Υλοποίησε τη συνάρτηση get_coordinate(), που παίρνει ένα ζεύγος (treasure, coordinate) από τη λίστα της Azara και επιστρέφει μόνο τη συντεταγμένη του χάρτη που έχει εξαχθεί.

>>> 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) από τη λίστα της Azara και μια καταγραφή (location, coordinate, quadrant) από τη λίστα του Rui και επιστρέφει (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. "Καθάρισε" και φτιάξε μια αναφορά με όλες τις καταγραφές

Καθάρισε τις συνδυασμένες καταγραφές της Azara και του Rui, ώστε να υπάρχει μόνο ένα σύνολο συντεταγμένων ανά καταγραφή. Φτιάξε μια αναφορά, για να βλέπουν μια λίστα με όλα όσα πρέπει να βάλουν στους χάρτες τους. Υλοποίησε τη συνάρτηση 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.