Tracks
/
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, tuples puede contener cualquier tipo de dato (o varios tipos), incluidos otros tuples. Las tuplas admiten todas las operaciones comunes de secuencia, pero no admiten las operaciones de secuencia mutables.

Los elementos de una tupla se pueden recorrer con la construcción for item in <tuple>. Si necesitas tanto el índice del elemento como su valor, puedes usar for index, item in enumerate(<tuple>). Como en cualquier secuencia, se puede acceder a los elementos dentro de tuples mediante la 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 dar 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 elementos de un iterable individual se añaden uno por 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",)

Las estructuras de datos anidadas se pueden incluir como elementos de 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 dentro de una tupla

Se puede acceder a los elementos dentro de un tuple mediante la 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 dentro de un tuple en un bucle usando la sintaxis for item in <tuple>. Si necesitas tanto los índices como los valores, puedes 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 un 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 una lista de tesoros con coordenadas en el mapa, y el otro, una lista de nombres de ubicaciones con coordenadas en el mapa. También les dieron mapas en blanco con un punto de partida marcado con ESTÁS AQUÍ.


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
Scrimshawed Whale 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 de una lista a la otra para averiguar qué tesoros corresponden a qué ubicaciones. Como son unos pythonistas 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. Extraer las coordenadas

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

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

2. Formatear las coordenadas

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

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

3. Hacer coincidir las coordenadas

Implementa la función compare_records() 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. Vuelve a formatear las coordenadas según sea necesario para hacer una comparación precisa.

>>> 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 toma un par (treasure, coordinate) de la lista de Azara y un registro (location, coordinate, quadrant) de la lista de Rui, y devuelve (treasure, coordinate, location, coordinate, quadrant) si las coordenadas coinciden. Si las coordenadas no coinciden, devuelve la cadena «not a match». Vuelve a formatear la coordenada según sea necesario para hacer una comparación precisa.

>>> 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 hacer un informe de todos los registros

Limpia los registros combinados de Azara y Rui para que quede solo un conjunto de coordenadas por registro. Haz un informe para que puedan ver una sola lista de todo lo que necesitan poner en sus mapas. Implementa la función clean_up() que toma una tupla de tuplas (todo lo de ambas listas), recorre la tupla externa, descarta las coordenadas que no se necesitan de cada tupla interna y agrega cada una a un «informe». Formatea y devuelve ese informe de modo 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 una pestaña nuevas
Python Exercism

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