Διαδρομές
/
Julia
Julia
/
Ασκήσεις
/
Κυνήγι θησαυρού στο Tisbury
Κυνήγι θησαυρού στο Tisbury

Κυνήγι θησαυρού στο Tisbury

Άσκηση εκμάθησης

Εισαγωγή

Μια Tuple μοιάζει αρκετά με έναν Vector (έναν array μίας διάστασης) σε πολλά σημεία. Ωστόσο, υπάρχουν μερικές σημαντικές διαφορές.

  • Οι πλειάδες γράφονται μέσα σε παρενθέσεις ( ) αντί για αγκύλες [ ], αν και οι παρενθέσεις μπορούν να παραλειφθούν σε περιπτώσεις όπου το νόημα είναι σαφές.
  • Οι πλειάδες δεν χρειάζεται να είναι ομοιογενείς: ο τύπος κάθε στοιχείου αποθηκεύεται ανεξάρτητα.
  • Οι πλειάδες είναι αμετάβλητες.

Η αμεταβλητότητα επιτρέπει περισσότερες βελτιστοποιήσεις από τον μεταγλωττιστή και κάνει τις πλειάδες πιο αποδοτικές από τα διανύσματα, οπότε αξίζει να προτιμώνται σε περιπτώσεις όπου η μεταβλητότητα δεν είναι απαραίτητη.

julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")

# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
  1: Int64 3
  2: Float64 5.2
  3: String "xyz"

julia> t[2]
5.2

# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})

Υπάρχει επίσης ένας κατασκευαστής Tuple(), που μετατρέπει οποιαδήποτε συλλογή που μπορεί να διατραπεί σε πλειάδα. Βολικά, αυτό αντιμετωπίζει τη συμβολοσειρά ως συλλογή χαρακτήρων που μπορεί να διατραπεί.

julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')

Σε οποιαδήποτε πλειάδα, μπορείς να έχεις πρόσβαση στα στοιχεία με τη θέση τους ή να τα διατρέξεις με έναν βρόχο.

Οποιαδήποτε καθαρά αριθμητική πλειάδα μπορεί επίσης να χρησιμοποιηθεί σε μαθηματικές συναρτήσεις όπως η sum(), ακριβώς όπως οι πίνακες.

Αποσυσκευασία

Μια πλειάδα μπορεί να αποσυσκευαστεί σε μεμονωμένα στοιχεία με πολλαπλή ανάθεση. Για στοιχεία που δεν χρειάζεσαι, χρησιμοποίησε την κάτω παύλα _ ως μεταβλητή-οδηγό.

julia> tup = (1, "Julia", true)
(1, "Julia", true)

julia> num, name, _ = tup
(1, "Julia", true)

julia> uppercase(name), 2num
("JULIA", 2)

Οι προγραμματιστές Python θα είναι πολύ εξοικειωμένοι με αυτή τη σύνταξη πολλαπλής ανάθεσης.

Ονομαστικές πλειάδες

Μια Tuple περιέχει μόνο τιμές. Μια NamedTuple αντιστοιχίζει κάθε τιμή με ένα όνομα.

Στη συνέχεια μπορείς να έχεις πρόσβαση σε κάθε πεδίο ξεχωριστά με τον συμβολισμό της τελείας:

julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)

julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
  a: Int64 1
  b: Float64 7.3

julia> nt.b
7.3

Το όνομα αποθηκεύεται εσωτερικά ως Symbol (ένας αμετάβλητος τύπος, με πρόθεμα άνω και κάτω τελεία :), οπότε υπάρχει διαθέσιμος και ένας εναλλακτικός συμβολισμός:

julia> nt[:b]
7.3

Είναι εύκολο να πάρεις ξεχωριστά είτε τα ονόματα (που ονομάζονται και "κλειδιά") είτε τις τιμές:

julia> nt
(a = 1, b = 7.3)

julia> keys(nt)
(:a, :b)

julia> values(nt)
(1, 7.3)

Σημείωσε ότι η επανάληψη πάνω σε μια ονομαστική πλειάδα παράγει μόνο τις τιμές, και τα ονόματα αγνοούνται.

Οι πλειάδες (ονομαστικές ή μη) είναι ένας πολύ συνηθισμένος τρόπος για να μεταφέρεις δομημένα δεδομένα από και προς συναρτήσεις. Η αμεταβλητότητα είναι καλή σε αυτή την περίπτωση χρήσης, καθώς παρέχει ασφάλεια δεδομένων και επιτρέπει πιο επιθετικές βελτιστοποιήσεις από τον μεταγλωττιστή.

Οδηγίες

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

Η λίστα της Azara Η λίστα του Rui
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 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

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

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

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

julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"

2. Μορφοποίηση συντεταγμένων

Υλοποίησε τη συνάρτηση convert_coordinate() που παίρνει μια συντεταγμένη στη μορφή "2A" και επιστρέφει μια πλειάδα στη μορφή ('2', 'A').

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

3. Αντιστοίχιση συντεταγμένων

Υλοποίησε τη συνάρτηση compare_records() που παίρνει ένα ζεύγος (treasure, coordinate) και μια καταγραφή (location, coordinate, quadrant) και συγκρίνει τις συντεταγμένες τους. Επίστρεψε true αν οι συντεταγμένες "ταιριάζουν", και επίστρεψε false αν δεν ταιριάζουν. Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για σωστή σύγκριση.

julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false

julia> 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 και επιστρέφει (coordinate, location, quadrant, treasure) αν οι συντεταγμένες ταιριάζουν.

Αν οι συντεταγμένες δεν ταιριάζουν, επίστρεψε μια κενή πλειάδα. Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για σωστή σύγκριση.

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

julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Julia Exercism

Έτοιμος να ξεκινήσεις την άσκηση Κυνήγι θησαυρού στο Tisbury;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.