Rutas
/
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 tengan 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 formas 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 han dado mapas en blanco con un punto de partida marcado con YOU ARE HERE.

Lista de Azara Lista de 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

Pero las cosas están un poco desorganizadas: las coordenadas de Azara parecen tener un formato y un orden distintos de las de Rui, y no dejan de mirar de una lista a otra para averiguar qué tesoros van con qué lugares. Como fsharpies incipientes, 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 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. Dar formato a 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 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 false si no lo hacen. Vuelve a dar formato a las coordenadas según sea necesario para compararlas con precisión.

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 coincidentes

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 con la misma forma pero rellena con "". Vuelve a dar formato a las coordenadas según sea necesario para compararlas con precisión.

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 pestaña nueva
F# Exercism

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