Baccalauréat — Épreuve pratique — 2026 — NSI
Épreuve pratique NSI 2026 — Sujet 22 : QR code simplifié et table ASCII
Sujet
Épreuve pratique de NSI, session 2026 — sujet n°22 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.
QR code simplifié
Un QR code dans sa version simplifiée est une image constituée de carrés noirs disposés sur un fond blanc. Ces carrés définissent l'information que contient le code et seront convertis en une chaîne de caractères lors du déchiffrement du code par un appareil.
Prenons par exemple un code de 6 × 8 carrés : chacun des 48 carrés est une case qui est soit noire et représente un bit de valeur 1, soit blanche et représente un bit de valeur 0. Chaque ligne de 8 cases est représentée par un tuple de 8 bits et le QR code entier par une liste de tuples.
Figure 1 : exemple de QR code simplifié (█ = case noire, · = case blanche) et sa représentation en liste de tuples.
· █ · · █ █ · █ (0,1,0,0,1,1,0,1)
· · █ · █ █ █ · (0,0,1,0,1,1,1,0)
· █ · · █ · · · (0,1,0,0,1,0,0,0)
· █ █ · · · · █ (0,1,1,0,0,0,0,1)
· █ █ █ · · █ · (0,1,1,1,0,0,1,0)
· █ █ · · · · █ (0,1,1,0,0,0,0,1)Le décodage du QR code s'effectue alors en deux étapes :
- chaque tuple est vu comme la représentation binaire d'un entier naturel en base 10. Par exemple, le tuple
(0,1,1,0,0,0,0,1)représente le nombre binaire 01100001 qui vaut 97 en base 10 ; - chaque entier obtenu est ensuite associé à un caractère selon une table de correspondance. On utilisera la table des codes ASCII (American Standard Code for Information Interchange, figure 2 du sujet), qui fournit un caractère unique pour chaque entier compris entre 0 et 127. Par exemple, l'entier 97 code le caractère
a.
La liste de tuples représentant le QR code devient donc une liste d'entiers, puis une chaîne de caractères, c'est-à-dire l'information du QR code.
Question 1. É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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 2. É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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 3. 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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 4. On souhaite maintenant réaliser l'opération inverse : générer un QR code à partir d'un texte. La fonction str2qrcode(message) a été rédigée dans ce but. Elle 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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Fichiers fournis
Le dossier comporte une version PDF de l'énoncé, le code source de départ qrcode.py et un module ascii.py contenant le dictionnaire de conversion dict_ascii et des données de tests.
qrcode.py
import ascii
#############################################################################
# Question 1 et 2 : Écrire les codes des fonctions bin2dec et qrcode2dec
# Proposer un test de qrcode2dec
#############################################################################
# implémentation du QR Code de la figure 1:
qrcode_fig1 = ascii.figure1
#############################################################################
# Question 3 : Fonctions dec2str et test_dec2str
#############################################################################
def dec2str(liste_dec):
""" entrée: liste d'entiers décimaux
sortie: chaine de caractère formée des caractères correspondant
de la table ascii """
table_ascii = ascii.dict_ascii
chaine = ""
for entier in liste_dec:
chaine += table_ascii[entier]
return chaine
def test_dec2str():
""" Teste la fonction dec2str avec des données issues du module fourni """
tests = [ascii.test1, ascii.test2, ascii.test3]
for test in tests:
print(dec2str(test))
def qrcode2str(qrcode):
return dec2str(qrcode2dec(qrcode))
#############################################################################
# Question 4 : Fonction str2qrcode déficiente
#############################################################################
def str2qrcode(message):
"""
Convertit une chaine de caractères en liste de tuples binaires.
"""
qrcode = []
table_inverse = {valeur: cle for cle, valeur in ascii.dict_ascii.items()}
for caractere in message:
entier = table_inverse.get(caractere, 63)
binaire_str = bin(entier)[2:]
ligne = tuple(int(bit) for bit in binaire_str)
qrcode.append(ligne)
return qrcodeascii.py
figure1 = [(0, 1, 0, 0, 1, 1, 0, 1),
(0, 0, 1, 0, 1, 1, 1, 0),
(0, 1, 0, 0, 1, 0, 0, 0),
(0, 1, 1, 0, 0, 0, 0, 1),
(0, 1, 1, 1, 0, 0, 1, 0),
(0, 1, 1, 0, 0, 0, 0, 1)]
dict_ascii = {
0: "NUL", 1: "SOH", 2: "STX", 3: "ETX", 4: "EOT", 5: "ENQ", 6: "ACK", 7: "BEL",
8: "BS", 9: "HT", 10: "LF", 11: "VT", 12: "FF", 13: "CR", 14: "SO", 15: "SI",
16: "DLE", 17: "DC1", 18: "DC2", 19: "DC3", 20: "DC4", 21: "NAK", 22: "SYN", 23: "ETB",
24: "CAN", 25: "EM", 26: "SUB", 27: "ESC", 28: "FS", 29: "GS", 30: "RS", 31: "US",
32: " ", 33: "!", 34: "\"", 35: "#", 36: "$", 37: "%", 38: "&", 39: "'",
40: "(", 41: ")", 42: "*", 43: "+", 44: ",", 45: "-", 46: ".", 47: "/",
48: "0", 49: "1", 50: "2", 51: "3", 52: "4", 53: "5", 54: "6", 55: "7",
56: "8", 57: "9", 58: ":", 59: ";", 60: "<", 61: "=", 62: ">", 63: "?",
64: "@", 65: "A", 66: "B", 67: "C", 68: "D", 69: "E", 70: "F", 71: "G",
72: "H", 73: "I", 74: "J", 75: "K", 76: "L", 77: "M", 78: "N", 79: "O",
80: "P", 81: "Q", 82: "R", 83: "S", 84: "T", 85: "U", 86: "V", 87: "W",
88: "X", 89: "Y", 90: "Z", 91: "[", 92: "\\", 93: "]", 94: "^", 95: "_",
96: "`", 97: "a", 98: "b", 99: "c", 100: "d", 101: "e", 102: "f", 103: "g",
104: "h", 105: "i", 106: "j", 107: "k", 108: "l", 109: "m", 110: "n", 111: "o",
112: "p", 113: "q", 114: "r", 115: "s", 116: "t", 117: "u", 118: "v", 119: "w",
120: "x", 121: "y", 122: "z", 123: "{", 124: "|", 125: "}", 126: "~", 127: "DEL"
}
test1 = [84, 101, 115, 116, 32, 49, 32, 114, 101, 117, 115, 115, 105, 33]
test2 = [84, 101, 115, 116, 32, 50, 32, 114, 101, 117, 115, 115, 105, 33]
test3 = [84, 101, 115, 116, 32, 51, 32, 114, 233, 117, 115, 115, 105, 33]Corrigé
Créez un compte gratuit : votre première correction est offerte.