Sujet n° 22 · Session 2026 · 1 heure
Lire et écrire un QR code simplifié
Un QR code simplifié est une grille de cases noires et blanches : chaque ligne code un caractère ASCII. Le candidat décode le nom de l'inventeur, protège le décodage contre un caractère inconnu, puis répare le codage qui perd des bits.
- Binaire
- Tuples
- Dictionnaires
- Table ASCII
- Débogage
Mise en situationLe principe
Chaque case du QR code est noire (bit 1) ou blanche (bit 0). Une ligne de 8 cases est représentée par un tuple de 8 bits, et le QR code entier par une liste de tuples. Pour le décoder, chaque tuple est lu comme l'écriture binaire d'un entier, par exemple (0, 1, 1, 0, 0, 0, 0, 1) vaut 97, puis chaque entier est associé à un caractère par la table ASCII, qui fournit un caractère pour chaque entier de 0 à 127 : 97 code le caractère a.
Le module ascii.py contient la représentation du QR code de la figure 1 (figure1), la table ASCII sous forme de dictionnaire (dict_ascii) et des données de test.
| Ligne de la figure 1 | Bits |
|---|---|
| 1 | (0, 1, 0, 0, 1, 1, 0, 1) |
| 2 | (0, 0, 1, 0, 1, 1, 1, 0) |
| 3 | (0, 1, 0, 0, 1, 0, 0, 0) |
| 4 | (0, 1, 1, 0, 0, 0, 0, 1) |
| 5 | (0, 1, 1, 1, 0, 0, 1, 0) |
| 6 | (0, 1, 1, 0, 0, 0, 0, 1) |
Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.
Pour l'examinateur
Le module s'appelle ascii, comme une fonction intégrée de Python qu'il masque : une bonne question pour un candidat curieux.
Question 1Du binaire au décimal
Écrire une fonction en Python nommée bin2dec qui prend en paramètre un tuple représentant un nombre binaire et qui renvoie l'entier naturel en base 10 correspondant. À l'aide des informations ci-dessus, déterminer la chaîne de caractères contenue dans le QR code de la figure 1 pour découvrir le nom de l'inventeur de ce système de codage.
Appel professeur
À demander au candidat
- Expliquez votre méthode sur
(0, 1, 1, 0, 0, 0, 0, 1). Parcourez-vous les bits de gauche à droite ou de droite à gauche ? - Quel est le plus grand entier codable sur 8 bits ? Et sur 7 ?
Deux méthodes : les puissances de 2 selon la position, ou le schéma de Horner (n = 2 * n + bit).
Résultats attendus
- Message de la figure 1
- M.Hara (Masahiro Hara)
Question 2Tout le QR code
Écrire une fonction en Python nommée qrcode2dec qui prend en paramètre une liste de tuples représentant un QR code et qui renvoie une liste d'entiers décimaux correspondant à chacune des lignes du QR code. Proposer un test de qrcode2dec qui utilisera la représentation du QR code de la figure 1 fournie dans le module ascii.py.
Appel professeur
À demander au candidat
- Pourquoi réutiliser
bin2decplutôt que recopier son code ? - Que renvoie votre fonction pour un QR code vide ?
Résultats attendus
qrcode2dec(figure1)[77, 46, 72, 97, 114, 97]
Question 3Un caractère inconnu
La table ASCII est ici implémentée dans le dictionnaire dict_ascii du module ascii.py. Il est utilisé par la fonction fournie dec2str qui prend en paramètre une liste d'entiers et renvoie une chaîne formée des caractères correspondants dans la table ASCII. Exécuter la fonction fournie test_dec2str et observer les résultats affichés. Identifier le problème et proposer une modification de la fonction dec2str pour l'éviter. Après modification, la fonction dec2str devra toujours renvoyer une chaîne lisible.
Appel professeur
À demander au candidat
- Quelle erreur obtenez-vous avec
test3, et pour quelle valeur ? Pourquoi 233 n'est-il pas dans la table ? - Quelles corrections possibles : tester
in, utiliserget, ou lever une erreur plus explicite ? Laquelle respecte la consigne d'une chaîne toujours lisible ?
233 (le « é ») dépasse 127 : table_ascii[233] lève une KeyError. La fonction doit continuer et remplacer le caractère, par exemple par ?.
Résultats attendus
test_dec2str(), code fourni- deux lignes puis
KeyError: 233 - Corrigé
- « Test 3 r?ussi! »
Question 4Coder un message
On souhaite maintenant réaliser l'opération inverse : générer un QR code à partir d'un texte. La fonction str2qrcode(message) parcourt les caractères du message, retrouve leur code ASCII, le convertit en binaire et génère le tuple correspondant. Cependant, en exécutant cette fonction sur la chaîne contenue dans le QR code de la figure 1, on obtient un résultat qui n'est pas exactement le QR code de la figure 1. Analyser le code de la fonction str2qrcode. Identifier la source de ce problème, puis proposer une modification du code afin de garantir l'obtention d'un QR code simplifié valide.
Appel professeur
À demander au candidat
- Que vaut
bin(77)? Combien de bits contient la chaîne obtenue après[2:]? - Pourquoi les tuples doivent-ils tous avoir 8 éléments ?
- À quoi sert la valeur 63 dans
table_inverse.get(caractere, 63)?
bin ne produit pas les zéros de tête : 77 donne 7 bits au lieu de 8. Il faut compléter à gauche, par exemple avec zfill(8).
Résultats attendus
str2qrcode('M.Hara'), code fourni- tuples de 6 ou 7 bits
- Corrigé
- identique à
figure1
Le fichier du candidat
Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un qrcode.py à ouvrir dans votre éditeur habituel.