Tracks
/
Julia
Julia
/
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

Una Tuple es muy similar a un Vector (un array unidimensional) en muchos aspectos. Sin embargo, hay algunas diferencias importantes.

  • Las tuplas se escriben entre paréntesis ( ) en lugar de corchetes [ ], aunque los paréntesis se pueden omitir cuando el significado no es ambiguo.
  • Las tuplas no tienen que ser homogéneas: el tipo de cada elemento se almacena de forma independiente.
  • Las tuplas son inmutables.

La inmutabilidad permite más optimizaciones del compilador y hace que las tuplas tengan mejor rendimiento que los vectores, así que conviene preferirlas cuando no se necesita mutabilidad.

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})

También existe un constructor Tuple(), que convierte cualquier colección iterable en una tupla. Algo muy útil: trata un string como una colección iterable de caracteres.

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

En cualquier tupla es posible acceder a los elementos por índice o recorrerlos con un bucle.

Cualquier tupla puramente numérica también se puede usar en funciones matemáticas como sum(), igual que los arrays.

Desempaquetado

Una tupla se puede desempaquetar en elementos individuales usando asignación múltiple. Para los elementos que no necesitas, usa el guion bajo _ como variable ficticia.

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

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

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

Quienes programan en Python estarán muy familiarizados con esta sintaxis de asignación múltiple.

Tuplas con nombre

Una Tuple solo contiene valores. Una NamedTuple asocia cada valor con un nombre.

Cada campo se puede acceder luego con la notación de «punto»:

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

El nombre se almacena internamente como un Symbol (un tipo inmutable, precedido por dos puntos :), así que hay una sintaxis alternativa disponible:

julia> nt[:b]
7.3

Es fácil obtener por separado los nombres (también llamados «claves») o los valores:

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

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

julia> values(nt)
(1, 7.3)

Ten en cuenta que al iterar sobre una tupla con nombre solo se producen los valores, y los nombres se ignoran.

Las tuplas (con nombre o no) son una forma muy común de transferir datos estructurados desde y hacia las funciones. La inmutabilidad viene muy bien en este caso: aporta seguridad a los datos y permite optimizaciones del compilador más agresivas.

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 ubicaciones con coordenadas del mapa. También les dieron mapas en blanco con un punto de partida marcado como AQUÍ ESTÁS.

Lista de Azara 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 desorganizadas: las coordenadas de Azara parecen estar formateadas y ordenadas de manera distinta a las de Rui, y tienen que ir mirando de una lista a la otra para descubrir qué tesoros van con qué ubicaciones. Como son programadores de Julia en ciernes, acudieron 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. Extrae las coordenadas

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

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

2. Formatea las coordenadas

Implementa la función convert_coordinate() que recibe una coordenada con el formato «2A» y devuelve una tupla con el formato ('2', 'A').

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

3. Compara las coordenadas

Implementa la función compare_records() que recibe 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 formatear las coordenadas como sea necesario para compararlas con exactitud.

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. Combina los registros coincidentes

Implementa la función create_record() que recibe 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 vacía. Vuelve a formatear las coordenadas como sea necesario para compararlas con exactitud.

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"))
()
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Julia Exercism

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

Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.