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

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

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

Εισαγωγή

Πλειάδες

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

Οι πλειάδες ορίζονται ως τιμές χωρισμένες με κόμμα ανάμεσα στους χαρακτήρες ( και ): (<element_1>, ... , <element_n>).

("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)

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

(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true

(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false

(1, 2) = (1, "2") // Same length, different types
// compiler error

(1, 2) = (1, 2, 3) // Different length
// compiler error

Υπάρχουν τρεις τρόποι με τους οποίους μπορείς να εξαγάγεις τιμές από μια πλειάδα:

  • Οι συναρτήσεις fst και snd
  • Αποδόμηση πλειάδας
  • Αντιστοίχιση προτύπων
let person = ("Jordan", 170)

// Option 1: fst/snd
let name1 = fst person
let length2 = snd person

// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170

// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3

Οδηγίες

Η 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
Scrimshaw Whale's 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, και πρέπει να κοιτάζουν συνεχώς από τη μια λίστα στην άλλη για να καταλάβουν ποιοι θησαυροί πάνε με ποιες τοποθεσίες. Καθώς είναι επίδοξοι fsharpies, ήρθαν σε σένα για βοήθεια, να γράψεις ένα μικρό πρόγραμμα (μια σειρά από συναρτήσεις, στην πραγματικότητα) για να οργανώσουν καλύτερα τις πληροφορίες του κυνηγιού τους.

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

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

getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"

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

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

convertCoordinate "2A"
// (2, 'A')

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

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

compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false

compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true

4. Συνδυασμός των καταγραφών που ταιριάζουν

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

createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

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

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

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