Parcours
/
Python
Python
/
Exercices
/
La chasse au trésor de Tisbury
La chasse au trésor de Tisbury

La chasse au trésor de Tisbury

Exercice d'apprentissage

Introduction

En Python, un tuple est une collection immuable d'éléments en séquence. Comme la plupart des collections, tuples peut contenir n'importe quel type (ou plusieurs types) de données, y compris d'autres tuples. Les tuples prennent en charge toutes les opérations courantes sur les séquences, mais ne prennent pas en charge les opérations sur les séquences mutables.

On peut parcourir les éléments d'un tuple avec la construction for item in <tuple>. Si l'on a besoin à la fois de l'indice et de la valeur d'un élément, on peut utiliser for index, item in enumerate(<tuple>). Comme pour toute séquence, on accède aux éléments d'un tuples via la notation entre crochets, en utilisant un indice 0-based index en partant de la gauche ou un indice -1-based index en partant de la droite. On peut aussi copier un tuple en entier ou en partie grâce à la notation de tranches (<tuple>[<start>:<stop>:<step>]).

Construction d'un tuple

Un tuple peut être créé de plusieurs façons : soit avec le constructeur de classe tuple(<iterable>), soit avec la déclaration littérale tuple.

Utilise le constructeur tuple() à vide ou avec un itérable :

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

Les strings sont itérables, donc utiliser une seule str comme argument du constructeur tuple() peut donner des résultats surprenants :

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

Les éléments d'un itérable sont ajoutés un par un :

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

>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Déclare un tuple comme littéral :

Comme le constructeur tuple(<iterable>) n'accepte que des itérables (ou rien du tout) comme arguments, il est bien plus simple de créer un tuple à un seul élément avec la méthode littérale.

>>> no_elements = ()
()

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

On peut inclure des structures de données imbriquées comme éléments d'un tuple, y compris d'autres 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"))

Concaténation de tuples

On peut concaténer des tuples avec l'opérateur plus +, qui décompose chaque tuple pour créer un nouveau tuple combiné.

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

Accéder aux éléments d'un tuple

On accède aux éléments d'un tuple via la notation entre crochets, en utilisant un indice 0-based index en partant de la gauche ou un indice -1-based index en partant de la droite.

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

Parcourir les éléments d'un tuple

On peut parcourir les éléments d'un tuple dans une boucle avec la syntaxe for item in <tuple>. Si l'on a besoin à la fois des indices et des valeurs, on peut utiliser 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.

Vérifier l'appartenance à un tuple

L'opérateur in permet de vérifier si une valeur appartient à un tuple.

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

>>> "Parrot" in multiple_elements_list
True

Instructions

Azara et Rui forment une équipe qui participe à une chasse au trésor sur le thème des pirates. L'un a une liste de trésors avec leurs coordonnées sur la carte, l'autre une liste de noms de lieux avec leurs coordonnées. On leur a aussi donné des cartes vierges avec un point de départ marqué «\u00A0VOUS ÊTES ICI\u00A0».


Liste d'Azara Liste de Rui
Trésor Coordonnées
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
Nom du lieu Coordonnées 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

Mais tout est un peu désorganisé\u00A0: les coordonnées d'Azara semblent formatées et triées différemment de celles de Rui, et ils doivent sans cesse passer d'une liste à l'autre pour déterminer quels trésors correspondent à quels lieux. Comme ce sont de jeunes passionnés de Python, ils sont venus te demander de l'aide pour écrire un petit programme (en fait, un ensemble de fonctions) qui organise mieux les informations de leur chasse.

1. Extrais les coordonnées

Implémente la fonction get_coordinate() qui prend une paire (treasure, coordinate) de la liste d'Azara et renvoie uniquement la coordonnée extraite sur la carte.

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

2. Formate les coordonnées

Implémente la fonction convert_coordinate() qui prend une coordonnée au format «\u00A02A\u00A0» et renvoie un tuple au format ("2", "A").

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

3. Fais correspondre les coordonnées

Implémente la fonction compare_records() qui prend une paire (treasure, coordinate) et un enregistrement (location, coordinate, quadrant), puis compare leurs coordonnées. Renvoie True si les coordonnées «\u00A0correspondent\u00A0», et False sinon. Remets les coordonnées au bon format si nécessaire pour comparer correctement.

>>> 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. Combine les enregistrements correspondants

Implémente la fonction create_record() qui prend une paire (treasure, coordinate) de la liste d'Azara et un enregistrement (location, coordinate, quadrant) de la liste de Rui, et renvoie (treasure, coordinate, location, coordinate, quadrant) si les coordonnées correspondent. Si les coordonnées ne correspondent pas, renvoie la string "not a match". Remets la coordonnée au bon format si nécessaire pour comparer correctement.

>>> 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. «\u00A0Nettoie\u00A0» et fais un rapport de tous les enregistrements

Nettoie les enregistrements combinés d'Azara et de Rui pour qu'il n'y ait plus qu'un seul jeu de coordonnées par enregistrement. Fais un rapport pour qu'ils voient une liste unique de tout ce qu'ils doivent reporter sur leurs cartes. Implémente la fonction clean_up() qui prend un tuple de tuples (tout le contenu des deux listes), parcourt le tuple externe, supprime les coordonnées inutiles de chaque tuple interne et ajoute chacun d'eux à un «\u00A0rapport\u00A0». Mets en forme et renvoie le «\u00A0rapport\u00A0» de façon à obtenir un enregistrement nettoyé par ligne.

>>> 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
"""
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Python Exercism

Prêt à commencer La chasse au trésor de Tisbury ?

Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.