Rutas
/
Python
Python
/
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

En Python, una tupla es una colección inmutable de elementos en secuencia. Como la mayoría de las colecciones, las tuples pueden contener cualquier tipo (o varios tipos) de datos, incluidas otras tuples. Las tuplas admiten todas las operaciones comunes de secuencia, pero no admiten las operaciones de secuencia mutables.

Se puede iterar sobre los elementos de una tupla con la construcción for item in <tuple>. Si se necesitan tanto el índice como el valor de un elemento, se puede usar for index, item in enumerate(<tuple>). Como en cualquier secuencia, se puede acceder a los elementos de las tuples mediante notación de corchetes, usando un 0-based index desde la izquierda o un -1-based index desde la derecha. Las tuplas también se pueden copiar total o parcialmente usando la notación de rebanadas (<tuple>[<start>:<stop>:<step>]).

Construcción de tuplas

Las tuplas se pueden formar de varias maneras, usando el constructor de la clase tuple(<iterable>) o la declaración literal de tuple.

Usar el constructor tuple() vacío o con un iterable:

>>> no_elements = tuple()
()

# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)

Los strings son iterables, así que usar un solo str como argumento del constructor tuple() puede tener resultados sorprendentes:

# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')

Los iterables añaden sus elementos uno a uno:

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Declarar una tupla como literal:

Como el constructor tuple(<iterable>) solo acepta iterables (o nada) como argumentos, es mucho más fácil crear una tupla de un solo elemento con el método literal.

>>> no_elements = ()
()

>>> one_element = ("Guava",)
("Guava",)

Se pueden incluir estructuras de datos anidadas como elementos de una tuple, incluidas otras tuples:

>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))

>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))

Concatenación de tuplas

Las tuplas se pueden concatenar con el operador más +, que desempaqueta cada tuple y crea una nueva tuple combinada.

>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")

#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")

>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')

Acceder a los elementos de una tupla

Se puede acceder a los elementos de una tuple mediante notación de corchetes, usando un 0-based index desde la izquierda o un -1-based index desde la derecha.

student_info = ("Alyssa", "grade 3", "female", 8 )

#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'

>>> student_gender = student_info[-2]
'female'

#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa

>>> student_name = student_info[-4]
Alyssa

Iterar sobre los elementos de una tupla

Se puede iterar sobre los elementos de una tuple en un bucle con la sintaxis for item in <tuple>. Si se necesitan tanto los índices como los valores, se puede usar for index, item in enumerate(<tuple>).

>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
...   print(item)

...
Alyssa
grade 3
female
8

>>> for index, item in enumerate(student_info):
...  print("Index is: " + str(index) + ", value is: " + str(item) +".")

...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.

Comprobar la pertenencia a una tupla

El operador in se puede usar para comprobar si un elemento pertenece a una tuple.

>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)

>>> "Parrot" in multiple_elements_list
True

Instrucciones

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


Array de Azara Array 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
Scrimshawed Whale Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Location Name Coordinates Quadrant
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 forma distinta a las de Rui, y no paran de ir de un array al otro para averiguar qué tesoros se corresponden con qué lugares. Como futuros pythonistas, han acudido a ti en busca de ayuda para 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 get_coordinate(), que recibe un par (treasure, coordinate) del array de Azara y devuelve únicamente la coordenada del mapa extraída.

>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A

2. Dar formato a 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").

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

3. Comparar 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 dar formato a las coordenadas según sea necesario para compararlas con precisión.

>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False

>>> compare_records(('Model Ship in Large Bottle', '8A'), ('Harbor Managers Office', ('8', 'A'), 'purple'))
True

4. Combinar los registros coincidentes

Implementa la función create_record(), que recibe un par (treasure, coordinate) del array de Azara y un registro (location, coordinate, quadrant) del array de Rui y devuelve (treasure, coordinate, location, coordinate, quadrant) si las coordenadas coinciden. Si las coordenadas no coinciden, devuelve el string «not a match». Vuelve a dar formato a la coordenada según sea necesario para compararla con precisión.

>>> create_record(('Brass Spyglass', '4B'), ('Abandoned Lighthouse', ('4', 'B'), 'Blue'))
('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')

>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"

5. «Limpiar» y crear un informe con todos los registros

Limpia los registros combinados de Azara y Rui para que solo haya un conjunto de coordenadas por registro. Crea un informe para que puedan ver en un solo array todo lo que tienen que poner en sus mapas. Implementa la función clean_up(), que recibe una tupla de tuplas (todo lo de ambos arrays), recorre la tupla externa, descarta las coordenadas que sobran de cada tupla interna y añade cada una a un «informe». Dale formato al «informe» y devuélvelo de manera que haya un registro limpio en cada línea.

>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))

"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Python Exercism

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

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.