Track
/
F#
F#
/
Esercizi
/
La caccia al tesoro di Tisbury
La caccia al tesoro di Tisbury

La caccia al tesoro di Tisbury

Esercizio di apprendimento

Introduzione

Tuple

Una tupla è un raggruppamento immutabile di valori senza nome ma ordinati. Le tuple possono contenere qualsiasi tipo di dato (o più tipi di dati), comprese altre tuple.

Le tuple sono definite come valori separati da virgole tra i caratteri ( e ): (<element_1>, ... , <element_n>).

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

Solo le tuple con la stessa lunghezza e gli stessi tipi (nello stesso ordine) possono essere confrontate. Le tuple hanno uguaglianza strutturale: sono uguali solo se tutti i loro valori sono uguali.

(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

Ci sono tre modi per estrarre valori da una tupla:

  • Le funzioni fst e snd
  • Destrutturazione della tupla
  • Pattern matching
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

Istruzioni

Azara e Rui sono compagni di squadra che gareggiano in una caccia al tesoro a tema pirata. Uno ha un elenco di tesori con le coordinate sulla mappa, l'altro un elenco di nomi di luoghi con le coordinate sulla mappa. Hanno anche ricevuto delle mappe vuote con un punto di partenza contrassegnato da SEI QUI.

Elenco di Azara Elenco di 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 Quandrant
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

Ma le cose sono un po' disordinate: le coordinate di Azara sembrano formattate e ordinate diversamente da quelle di Rui, e devono continuare a passare da un elenco all'altro per capire quali tesori vanno con quali luoghi. Da aspiranti programmatori di F#, si sono rivolti a te per scrivere un piccolo programma (in realtà un insieme di funzioni) che organizzi meglio le informazioni della loro caccia.

1. Estrarre le coordinate

Implementa la funzione getCooordinate() che prende una coppia (treasure, coordinate) dall'elenco di Azara e restituisce solo la coordinata sulla mappa estratta.

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

2. Formattare le coordinate

Implementa la funzione convertCoordinate() che prende una coordinata nel formato «2A» e restituisce una tupla nel formato (2, 'A').

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

3. Confrontare le coordinate

Implementa la funzione compareRecords() che prende una coppia (treasure, coordinate) e un record (location, coordinate, quadrant) e confronta le coordinate di ciascuno. Restituisci true se le coordinate «corrispondono» e false se non corrispondono. Riformatta le coordinate come serve per un confronto accurato.

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. Combinare i record corrispondenti

Implementa la funzione createrecord() che prende una coppia (treasure, coordinate) dall'elenco di Azara e un record (location, coordinate, quadrant) dall'elenco di Rui e restituisce (coordinate, location, quadrant, treasure) se le coordinate corrispondono. Se le coordinate non corrispondono, restituisci una tupla della stessa forma ma riempita con "". Riformatta le coordinate come serve per un confronto accurato.

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

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
F# Exercism

Vuoi iniziare La caccia al tesoro di Tisbury?

Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.