Dictionnaire et fonction en Python

Apprends à utiliser les dictionnaires et à créer une fonction Python claire et efficace.

→ Challenge Correction: Bug-out Shelter #1 – The Signal

Introduction et mécanique du challenge

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 :

  • Associer chaque mot à une lettre ou un espace
  • Associer chaque nouveau mot déchiffré à un chiffre (TROIS => 3)

Pour réussir cela, une possibilité était de créer des dictionnaires.

Création de 2 dictionnaires en Python

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.

Création d’une fonction en Python

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 :

  • On déclare une fonction decode, qui prendra en paramètre un message sous forme de chaine de caractères (str) et qui retournera un entier (int)
  • Pour la première ligne :
    • message.split() découpe la phrase en mots OTAN (« Tango » « Romeo » … « Space »)
    • Pour chaque mot, on récupère la lettre associée dans le dictionnaire alphabet
    •  ».join() concatène toutes ces lettres sans séparateur
    • On obtient alors une grande chaine en majuscules qui colle les mots puisqu’on a éliminé les espaces (via « Space » : «  »). On a donc par exemple « TROISCINQ »
  • La boucle for permet de parcourir le dictionnaire chiffres pour tenter de remplacer chaque chiffre écrit en lettre par sa valeur.
  • Et on retourne la chaine finale, en l’ayant converti préalablement en entier

Code final complet

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)}")

Qui a codé ce superbe contenu ?

Keep learning

Other content to discover