# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 22 Thème : QR code simplifié, binaire et ASCII """ from __future__ import annotations 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), ] # Dictionnaire minimal suffisant pour les tests. Dans le sujet, il est fourni dans ascii.py. # dict_ascii = {i: chr(i) for i in range(32, 127)} # dict_ascii.update({0: "NUL", 127: "DEL"}) 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] ############################################################################# # Question 1 et 2 : Écrire les codes des fonctions bin2dec et qrcode2dec # Proposer un test de qrcode2dec ############################################################################# # solution 1 def bin2dec(bits: tuple[int, ...]) -> int: """Convertit un tuple de bits en entier décimal.""" valeur = 0 for bit in bits: valeur = 2 * valeur + bit return valeur # solution 2 def bin2dec2(t): """Convertit un tuple de bits en entier décimal.""" valeur = 0 # On initialise n à 0 for i in range(len(t)): # On parcourt le tuple de gauche à droite valeur += t[i]*2 ** (len(t)-i-1) # On ajoute la puissance de 2 correspondant au rang de i return valeur # On renvoie n def qrcode2dec(qrcode: list[tuple[int, ...]]) -> list[int]: """Convertit chaque ligne binaire du QR code en entier décimal.""" return [bin2dec(ligne) for ligne in qrcode] # pour décoder la figure1 # implémentation du QR Code de la figure 1: qrcode_fig1 = figure1 sol = '' for lst in qrcode_fig1: sol += dict_ascii[bin2dec(lst)] print(sol) ############################################################################# # Question 3 : Fonctions dec2str et test_dec2str ############################################################################# # À l'exécution de la fonction test_dec2str, on obtient l'erreur KeyError: 233. # Cela signifie qu'aucune valeur n'est associée à la clé 233 dans le dictionnaire ascii, # qui ne contient que des clés entre 0 et 127. # Il faut donc rajouter un test pour vérifier la validité de la clé : # solution 1 def dec2str(liste_dec: list[int]) -> str: """ Convertit une liste de codes décimaux en chaîne. Si un code n'est pas dans la table ASCII fournie, on affiche '(ERR)'. """ chaine = "" for entier in liste_dec: chaine += dict_ascii.get(entier, "(ERR)") return chaine # solution 2 def dec2str2(liste_dec): """ Convertit une liste de codes décimaux en chaîne. Si un code n'est pas dans la table ASCII fournie, on affiche '(ERR)'. """ table_ascii = ascii.dict_ascii chaine = "" for entier in liste_dec: if 0<=entier<=127: # Modification: on vérifie que entier est présent comme clé chaine += table_ascii[entier] # Si oui, on ajoute le caractère else: # Si non, chaine += "(ERR)" # On met un caractère d'erreur return chaine def qrcode2str(qrcode: list[tuple[int, ...]]) -> str: return dec2str(qrcode2dec(qrcode)) ############################################################################# # Question 4 : Fonction str2qrcode déficiente ############################################################################# def str2qrcode(message: str) -> list[tuple[int, ...]]: """ Convertit un message en QR code simplifié. Correction : chaque tuple doit contenir exactement 8 bits, donc on utilise zfill(8). """ qrcode = [] table_inverse = {valeur: cle for cle, valeur in dict_ascii.items()} for caractere in message: entier = table_inverse.get(caractere, 63) binaire_str = bin(entier)[2:].zfill(8) ligne = tuple(int(bit) for bit in binaire_str) qrcode.append(ligne) return qrcode def tests() -> None: assert bin2dec((0, 1, 1, 0, 0, 0, 0, 1)) == 97 assert bin2dec2((0, 1, 1, 0, 0, 0, 0, 1)) == 97 assert qrcode2dec(figure1) == [77, 46, 72, 97, 114, 97] assert qrcode2str(figure1) == "M.Hara" assert dec2str(test1) == "Test 1 reussi!" assert dec2str(test3) == "Test 3 r(ERR)ussi!" assert str2qrcode("M.Hara") == figure1 print("Tous les tests du sujet 22 sont passés.") if __name__ == "__main__": tests()