Trilhas
/
Python
Python
/
Exercícios
/
Caça ao Tesouro de Tisbury
Caça ao Tesouro de Tisbury

Caça ao Tesouro de Tisbury

Exercício de aprendizagem

Introdução

Em Python, uma tupla é uma coleção imutável de itens em sequência. Como a maioria das coleções, tuples podem conter qualquer tipo de dado (ou vários tipos), incluindo outras tuples. As tuplas dão suporte a todas as operações comuns de sequência, mas não dão suporte a operações de sequência mutáveis.

Os elementos de uma tupla podem ser iterados usando a construção for item in <tuple>. Se você precisar tanto do índice quanto do valor do elemento, pode usar for index, item in enumerate(<tuple>). Como em qualquer sequência, os elementos dentro de tuples podem ser acessados com a notação de colchetes, usando um número 0-based index a partir da esquerda ou um número -1-based index a partir da direita. As tuplas também podem ser copiadas por inteiro ou em parte usando a notação de fatiamento (<tuple>[<start>:<stop>:<step>]).

Construção de Tuplas

As tuplas podem ser formadas de várias maneiras, usando o construtor de classe tuple(<iterable>) ou a declaração literal tuple.

Usando o construtor tuple() vazio ou com um iterável:

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

Strings são iteráveis, então usar uma única str como argumento do construtor tuple() pode ter resultados surpreendentes:

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

Iteráveis simples têm seus elementos adicionados um a um:

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

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

Como o construtor tuple(<iterable>) só aceita iteráveis (ou nada) como argumentos, é muito mais fácil criar uma tupla de um único elemento pelo método literal.

>>> no_elements = ()
()

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

Estruturas de dados aninhadas podem ser incluídas como elementos de tuple, incluindo outras 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"))

Concatenação de Tuplas

As tuplas podem ser concatenadas com o operador de soma +, que desempacota cada tuple e cria uma nova 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')

Acessando Elementos Dentro de uma Tupla

Os elementos dentro de uma tuple podem ser acessados com a notação de colchetes, usando um número 0-based index a partir da esquerda ou um número -1-based index a partir da direita.

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

Iterando Sobre os Elementos de uma Tupla

Os elementos dentro de uma tuple podem ser iterados em um laço usando a sintaxe for item in <tuple>. Se você precisar tanto dos índices quanto dos valores, pode 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.

Verificando Pertencimento em uma Tupla

O operador in pode ser usado para verificar se algo pertence a uma tuple.

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

>>> "Parrot" in multiple_elements_list
True

Instruções

Azara e Rui são colegas de equipe competindo em uma caça ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas de mapa, o outro uma lista de nomes de locais com coordenadas de mapa. Eles também receberam mapas em branco com um ponto de partida marcado como VOCÊ ESTÁ AQUI.


Lista da Azara Lista do 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

Mas as coisas estão um pouco desorganizadas: as coordenadas da Azara parecem estar formatadas e ordenadas de forma diferente das do Rui, e eles precisam ficar olhando de uma lista para a outra para descobrir quais tesouros combinam com quais locais. Como aspirantes a pythonistas, eles procuraram você para ajudar a escrever um pequeno programa (um conjunto de funções, na verdade) para organizar melhor as informações da caçada.

1. Extrair coordenadas

Implemente a função get_coordinate() que recebe um par (treasure, coordinate) da lista da Azara e retorna apenas a coordenada de mapa extraída.

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

2. Formatar coordenadas

Implemente a função convert_coordinate() que recebe uma coordenada no formato "2A" e retorna uma tupla no formato ("2", "A").

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

3. Comparar coordenadas

Implemente a função compare_records() que recebe um par (treasure, coordinate) e um registro (location, coordinate, quadrant) e compara as coordenadas de cada um. Retorne True se as coordenadas "combinarem", e retorne False se não combinarem. Reformate as coordenadas conforme necessário para uma comparação 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 registros correspondentes

Implemente a função create_record() que recebe um par (treasure, coordinate) da lista da Azara e um registro (location, coordinate, quadrant) da lista do Rui e retorna (treasure, coordinate, location, coordinate, quadrant) se as coordenadas combinarem. Se as coordenadas não combinarem, retorne a string "not a match". Reformate a coordenada conforme necessário para uma comparação 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. "Fazer uma limpeza" e criar um relatório de todos os registros

Faça uma limpeza nos registros combinados da Azara e do Rui para que haja apenas um conjunto de coordenadas por registro. Crie um relatório para que eles possam ver uma única lista de tudo o que precisam colocar em seus mapas. Implemente a função clean_up() que recebe uma tupla de tuplas (tudo das duas listas), percorre a tupla externa, descarta as coordenadas indesejadas de cada tupla interna e adiciona cada uma a um 'relatório'. Formate e retorne o 'relatório' de modo que haja um registro limpo em cada linha.

>>> 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 via GitHub O link abre em uma nova janela ou aba
Python Exercism

Tudo pronto para começar Caça ao Tesouro de Tisbury?

Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.