Tracks
/
F#
F#
/
Ejercicios
/
La búsqueda del tesoro de Tisbury
La búsqueda del tesoro de Tisbury

La búsqueda del tesoro de Tisbury

Ejercicio de aprendizaje

Introducción

Tuplas

Una tupla es una agrupación inmutable de valores sin nombre pero ordenados. Las tuplas pueden contener cualquier tipo de dato (o varios), incluidas otras tuplas.

Las tuplas se definen como valores separados por comas entre los caracteres ( y ): (<element_1>, ... , <element_n>).

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

Solo se pueden comparar las tuplas que tienen la misma longitud y los mismos tipos (en el mismo orden). Las tuplas tienen igualdad estructural, lo que significa que son iguales solo si todos sus valores son iguales.

(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

Hay tres maneras de extraer valores de una tupla:

  • Las funciones fst y snd
  • La deconstrucción de tuplas
  • La coincidencia de patrones
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

Instrucciones

Azara y Rui son compañeros de equipo que compiten en una búsqueda del tesoro con temática pirata. Uno tiene una lista de tesoros con coordenadas del mapa y el otro una lista de nombres de lugares con coordenadas del mapa. También les dieron mapas en blanco con un lugar de partida marcado con AQUÍ ESTÁS.

La lista de Azara La lista de Rui
Tesoro Coordenadas
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
Nombre de la ubicación Coordenadas Cuadrante
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

Pero las cosas están un poco desordenadas: las coordenadas de Azara parecen tener otro formato y otro orden que las de Rui, y tienen que estar mirando de una lista a la otra para descubrir qué tesoros van con qué lugares. Como son unos fsharpies en ciernes, han acudido a ti para que les ayudes a escribir un pequeño programa (en realidad, un conjunto de funciones) que organice mejor la información de su búsqueda.

1. Extraer las coordenadas

Implementa la función getCooordinate(), que toma un par (treasure, coordinate) de la lista de Azara y devuelve únicamente la coordenada del mapa extraída.

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

2. Formatear las coordenadas

Implementa la función convertCoordinate(), que toma una coordenada con el formato "2A" y devuelve una tupla con el formato (2, 'A').

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

3. Comparar las coordenadas

Implementa la función compareRecords(), que toma un par (treasure, coordinate) y un registro (location, coordinate, quadrant) y compara las coordenadas de cada uno. Devuelve true si las coordenadas «coinciden» y devuelve false si no. Vuelve a darles formato a las coordenadas según haga falta para compararlas con exactitud.

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. Combinar los registros que coinciden

Implementa la función createrecord(), que toma un par (treasure, coordinate) de la lista de Azara y un registro (location, coordinate, quadrant) de la lista de Rui y devuelve (coordinate, location, quadrant, treasure) si las coordenadas coinciden. Si las coordenadas no coinciden, devuelve una tupla de la misma forma pero rellena de "". Vuelve a darles formato a las coordenadas según haga falta para compararlas con exactitud.

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

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
F# Exercism

¿Todo listo para empezar La búsqueda del tesoro de Tisbury?

Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.