T: / Corrigés des challenges / Python
Apprends à utiliser les dictionnaires et à créer une fonction Python claire et efficace.
C’est parti pour les corrigés de l’édition 2025 de la Battle Dev Thales ! Les challenges et les corrigés seront diffusés au fil de l’eau dans les prochaines semaines.
On démarrait fort avec un premier challenge, qui n’était pas forcément le plus facile… avec un énoncé énigmatique…
Il fallait décrire 2 messages de ce type :
Tango Romeo Oscar India Sierra Space Charlie India November Quebec
Il fallait reconnaitre ici l’alphabet OTAN. On l’entend souvent dans les films militaires ou les séquences d’espionnage. C’est un alphabet phonétique international qui associe chaque lettre à un mot (A → Alpha, B → Bravo, C → Charlie) afin d’éviter toute confusion lors de communications orales.
Il y avait une subtilité avec l’ajout du terme « Space » qui servait de délimiteur. Si on déchiffre visuellement la séquence d’au dessus, on obtient : 3 5
Tango Romeo Oscar India Sierra Space Charlie India November Quebec
Pour résoudre ce challenge, il fallait donc :
Pour réussir cela, une possibilité était de créer des dictionnaires.
Un dictionnaire est une structure de données qui associe des clés à des valeurs. Voici comment les créer en Python :
# Alphabet OTAN
alphabet = {
"Alpha": "A", "Bravo": "B", "Charlie": "C", "Delta": "D", "Echo": "E",
"Foxtrot": "F", "Golf": "G", "Hotel": "H", "India": "I", "Juliett": "J",
"Kilo": "K", "Lima": "L", "Mike": "M", "November": "N", "Oscar": "O",
"Papa": "P", "Quebec": "Q", "Romeo": "R", "Sierra": "S", "Tango": "T",
"Uniform": "U", "Victor": "V", "Whiskey": "W", "X-ray": "X", "Yankee": "Y",
"Zulu": "Z", "Space": ""
}
# Correspondance des chiffres
chiffres = {
"ZERO": 0, "UN": 1, "DEUX": 2, "TROIS": 3, "QUATRE": 4,
"CINQ": 5, "SIX": 6, "SEPT": 7, "HUIT": 8, "NEUF": 9
}
On donne un nom à chaque dictionnaire. Les clés sont des chaines de caractères et les valeurs peuvent être d’un type différent : des chaines de caractères dans le premier dictionnaire, puis des entiers dans le second.
Comme on a 2 messages à traiter exactement de la même façon, on peut créer une fonction. Cela permettra de ne pas doubler la même logique de code. Le but ici est convertir directement le message de départ en nombre en sortie :
« Tango Romeo Oscar India Sierra Space Charlie India November Quebec » => 35
Voici la fonction que l’on peut créer :
def decode(message: str) -> int:
# Convertit le message OTAN en texte brut (ex : TANGO -> T)
texte = ''.join(alphabet[mot] for mot in message.split())
# Cherche les chiffres écrits en toutes lettres dans ce texte
for mot, val in chiffres.items():
texte = texte.replace(mot, str(val))
return int(texte)
Un peu d’explications :
Les dictionnaires, la fonction, et leur utilisation pour afficher la réponse au format attendu :
# Alphabet OTAN
alphabet = {
"Alpha": "A", "Bravo": "B", "Charlie": "C", "Delta": "D", "Echo": "E",
"Foxtrot": "F", "Golf": "G", "Hotel": "H", "India": "I", "Juliett": "J",
"Kilo": "K", "Lima": "L", "Mike": "M", "November": "N", "Oscar": "O",
"Papa": "P", "Quebec": "Q", "Romeo": "R", "Sierra": "S", "Tango": "T",
"Uniform": "U", "Victor": "V", "Whiskey": "W", "X-ray": "X", "Yankee": "Y",
"Zulu": "Z", "Space": ""
}
# Correspondance des chiffres
chiffres = {
"ZERO": 0, "UN": 1, "DEUX": 2, "TROIS": 3, "QUATRE": 4,
"CINQ": 5, "SIX": 6, "SEPT": 7, "HUIT": 8, "NEUF": 9
}
def decode(message: str) -> int:
# Convertit le message OTAN en texte brut (ex : TANGO -> T)
texte = ''.join(alphabet[mot] for mot in message.split())
# Cherche les chiffres écrits en toutes lettres dans ce texte
for mot, val in chiffres.items():
texte = texte.replace(mot, str(val))
return int(texte)
print(f"{decode(message_x)}_{decode(message_y)}")
Other content to discover