Décodage de CESAR en python (3)

« Questions flash »

  • Qu’affiche l’exécution de ce code ?
    def mystery(N):
        assert N > 0
    
        reponse = 0
        while N > 0:
            N = N // 2
            reponse += 1
        return reponse
    
    print(mystery(100))
    
    print(mystery(42))
    
    print(mystery(7))
    
    print(mystery(-42))
  • Que signifie le résultat renvoyé par mystery(N) pour un nombre entier N strictement positif ?

Corrections d’exercices donnés la veille

  • créer ce dictionnaire : {'A' : 0, 'B' : 0, ... , 'Z' : 0}
    • avec une boucle for i in range(26):,
    • en compréhension.
>>> freq = {}
>>> for i in range(26): freq[chr(i+65)] = 0

>>> freq
{'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0, 'Z': 0}
>>> dico = {chr(i) : i for i in range(65, 91)}
>>> dico
{'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70, 'G': 71, 'H': 72, 'I': 73, 'J': 74, 'K': 75, 'L': 76, 'M': 77, 'N': 78, 'O': 79, 'P': 80, 'Q': 81, 'R': 82, 'S': 83, 'T': 84, 'U': 85, 'V': 86, 'W': 87, 'X': 88, 'Y': 89, 'Z': 90}
>>> 
  • créer une fonction lit_et_affiche() qui
    • ouvre un fichier texte « texte.txt » (en lecture)
    • l’affiche dans le shell.
def lit_et_affiche(nom):
    with open nom as fichier:
        contenu = fichier.read()
        print(contenu)
        fichier.close()

Suite et fin du TP : décodage de CESAR en python

Automatiquement sur un grand texte par analyse de fréquences

On veut maintenant décoder un fichier enregistré dans le même dossier que notre programme mais en trouvant le décalage par analyse de fréquence :

  • Copier le texte ci-dessous dans un fichier texte.txt ,
  • ouvrir ce fichier et récupérer le contenu dans une chaîne de caractères contenu ,
  • qu’on peut mettre en majuscules avec contenu = contenu.upper(),
  • créer un dictionnaire freq ayant pour clés toutes les lettres majuscules non accentuées et pour valeurs des zéros,
  • parcourir la chaîne contenu et incrémenter à chaque lettre la valeur correspondant à cette clé dans le dictionnaire,
  • rechercher le caractère de l’alphabet le plus fréquent dans contenu : c’est la clé qui a la plus grande valeur dans le dictionnaire freq et elle correspond au caractère « e » dans le texte décodé !
  • en déduire le décalage et décoder à l’aide de la fonction codée la veille !
Xg vkrimhzktiabx, ex vabyykxfxgm itk wxvtetzx, tnllb vhggn vhffx ex vabyykx wx Vxltk hn ex vhwx wx Vxltk (ohbk exl wbyyxkxgml ghfl), xlm ngx fxmahwx wx vabyykxfxgm mkxl lbfiex nmbeblxx itk Cnexl Vxltk wtgl lxl vhkkxlihgwtgvxl lxvkxmxl (vx jnb xqiebjnx ex ghf « vabyykx wx Vxltk »).
Ex mxqmx vabyykx l'humbxgm xg kxfietçtgm vatjnx exmmkx wn mxqmx vetbk hkbzbgte itk ngx exmmkx t wblmtgvx ybqx, mhnchnkl wn fxfx vhmx, wtgl e'hkwkx wx e'teiatuxm. Ihnk exl wxkgbxkxl exmmkxl (wtgl ex vtl w'ng wxvtetzx t wkhbmx), hg kxikxgw tn wxunm. Itk xqxfiex toxv ng wxvtetzx wx 3 oxkl et wkhbmx, T xlm kxfietvx itk W, U wxobxgm X, xm tbglb cnljn't P jnb wxobxgm S, inbl Q wxobxgm T xmv. Be l'tzbm w'ngx ixkfnmtmbhg vbkvnetbkx wx e'teiatuxm. Et ehgznxnk wn wxvtetzx, 3 wtgl e'xqxfiex xohjnx, vhglmbmnx et vex wn vabyykxfxgm jn'be lnyybm wx mktglfxmmkx tn wxlmbgtmtbkx — l'be ltbm wxct jn'be l'tzbm w'ng vabyykxfxgm wx Vxltk — ihnk jnx vxenb-vb inbllx wxvabyykxk ex fxlltzx. Wtgl ex vtl wx e'teiatuxm etmbg, ex vabyykx wx Vxltk g't jnx 26 vexl ihllbuexl (r vhfikbl et vex gneex, jnb gx fhwbybx itl ex mxqmx).

Be l'tzbm w'ng vtl itkmbvnebxk wx vabyykxfxgm itk lnulmbmnmbhg fhghteiatuxmbjnx : vxl lnulmbmnmbhgl kxihlxgm lnk ng ikbgvbix tgtehznx, ftbl lhgm humxgnxl itk wxl ixkfnmtmbhgl jnxevhgjnxl wxl exmmkxl wx e'teiatuxm. Wtgl ex vtl zxgxkte, et vex xlm whggxx itk et ixkfnmtmbhg, xm ex ghfukx wx vexl ihllbuexl xlm tehkl ltgl vhffngx fxlnkx toxv vxenb wxl vabyykxfxgml wx Vxltk.

Ex vabyykxfxgm wx Vxltk t in xmkx nmbeblx vhffx xexfxgm w'ngx fxmahwx ienl vhfiexqx, vhffx ex vabyykx wx Obzxgxkx. Lxne, be g'hyykx tnvngx lxvnkbmx wx vhffngbvtmbhg, t vtnlx wn mkxl ytbuex ghfukx wx vexl, vx jnb ixkfxm w'xlltrxk lrlmxftmbjnxfxgm vxeexl-vb jntgw et fxmahwx wx vabyykxfxgm xlm vhggnx, ftbl tnllb itkvx jnx, vhffx mhnm xgvhwtzx itk lnulmbmnmbhg fhghteiatuxmbjnx, be ixnm xmkx mkxl ktibwxfxgm « vtllx » itk tgterlx wx ykxjnxgvxl (vxkmtbgxl exmmkxl tiitktbllxgm uxtnvhni ienl lhnoxgm jnx exl tnmkxl wtgl ngx etgznx gtmnkxeex).

Pour demain, essayer de continuer , on reprendra après avec la suite de notre « projetLaby » pour la journée « Portes Ouvertes » de samedi 14 😉

Décodage de CESAR en python (2)

« Questions flash »

  • Qu’affiche l’exécution de ce code ?
    def cube(x):
        return x * x * x
    
    def diff(a, b):
        return b - a
    
    print(diff(2, cube(3)))
    
    def mystery(A, N):
        reponse = 0
        while A < N:
            A = A ** 2
            reponse += 1
        return reponse
    
    print(mystery(3, 100))
    
    print(mystery(100, 3))

Correction des exercices donnés mercredi pour aujourd’hui :

  • créer ces listes en compréhension (oublié ? Voir exemple 3 de ce cours) :
    • [10, 8, 6, 4, 2, 0, -2, -4, -6, -8]:
    • ['a', 'c', 'e', ... , 'y']
  • créer ce dictionnaire : {'A' : 0, 'B' : 1, ... , 'Z' : 25}
    • avec une boucle for i in range(26):,
    • en compréhension.
  • créer une fonction mot_de_passe(a, b, c) qui renvoie un mot de passe aléatoire constitué de
    • a lettres minuscules,
    • b lettres majuscules,
    • c chiffres.

On discute préconditions et postconditions et on en teste quelques unes avec la fonction assert(), qu’on présente.

Reprise d’un ancien TP délaissé : décodage de CESAR en python

Objectifs :

  • Réviser le parcours d’un texte avec une boucle,
  • reparler code ASCII,
  • faire un bon découpage fonctionnel,
  • faire des tests dans notre programmation avec la fonction assert(),
  • utiliser un dictionnaire,
  • qu’on construira en compréhension.

Beau programme !

Depuis lundi 20 janvier, on veut créer une fonction decode(texte, decalage) qui prend en paramètre une chaîne de caractères texte non accentuée et effectue le décodage de CESAR avec un décalage de decalage.

Caesar3

Ici decalage vaut 3.

Cette fonction

  • Crée un chaîne de caractères vide resultat ,
  • parcourt la chaîne de caractères texte , lettre par lettre :
    • Si la lettre est une minuscule, on ajoute ou plutôt on concatène à resultat une lettre new décalée de decalage. Attention, on doit tester si on dépasse le z et sinon agir en conséquence !
    • sinon si la lettre est une majuscule, on concatène à resultat une lettre new décalée de decalage. Attention, là encore, on doit tester si on dépasse le Z et sinon agir en conséquence !
    • sinon on conserve la lettre et c’est elle qu’on concatène à resultat.
  • renvoie la nouvelle chaîne resultat.

Je propose de la tester :

  • d’abord avec des tests et l’instruction assert :
    # Des tests !
    assert decode("", 5) == ""
    assert decode("Ac Z!", 5) == "Fh E!"
  • puis avec ce texte à décoder :
"Lpz x'zno xcjpzooz yz kmjbmvhhzm zi ktocji kziyvio gzn xjpmn yz IND !"

Le tableau du jour :

Le code corrigé en cliquant sur « lire la suite » ci-dessous.

Pour demain, séance exceptionnelle (salle H.M.I. 13h22 – 15h17) :

  • créer ce dictionnaire : {'A' : 0, 'B' : 0, ... , 'Z' : 0}
    • avec une boucle for i in range(26):,
    • en compréhension.
  • créer une fonction lit_et_affiche() qui
    • ouvre un fichier texte « texte.txt » (en lecture)
    • l’affiche dans le shell.

Deuxième partie du cours : travail sur le projetLaby


Lire la suite

Encodage du texte – TP César

Rendu du test de lundi dernier et commentaires :


Encodage des caractères – Correction des exercices :

Question 1 :

  • Combien de caractères différents peut on coder en UTF-8 ?

Question 2 :

On a la séquence de huit octets suivante :

C3 A9 6C C3 A8 76 65 73

où chaque octet est représenté par deux chiffres hexadécimaux.

  • Si on considère que c’est en latin-1, décoder la séquence.
  • Idem en UTF-8.
  • Verdict ?

Le tableau de cette correction, ou je dis un peu n’importe quoi pour la première question, enfin, tout est question de théorie, voir ici :


TP noté – par deux : codage de César

La page wikipedia qui parle de ce codage par décalage en cliquant ici.

Avec un tableur, au vidéoprojecteur :

cm 2020-01-20 NSI CESAR au tableur

En python ?

Rappel sur les parcours de chaînes de caractères et nouvelles fonctionnalités :

mot = "CESAR"

# indices
print(mot[0])
print(mot[2])

print()

# deux manières de parcourir
for i in range(len(mot)):
    print(mot[i])

print()

for lettre in mot:
    print(lettre)

print()

# le code ASCII ?
for lettre in mot:
    print(ord(lettre))

print()

# créer une chaîne ...
nouveau_mot = ""

# ... et la compléter avec des codes ASCII
for j in range(5):
    nouveau_mot += chr(65 + j)

print(nouveau_mot)
C
S

C
E
S
A
R

C
E
S
A
R

67
69
83
65
82

ABCDE
>>>

Décodons !

Créer une fonction decode(texte, decalage) qui prend en paramètre une chaîne de caractères texte de lettres majuscules non accentuées et effectue le décodage de CESAR avec un décalage de decalage.

La tester avec ce texte à décoder :

"Lpz x'zno xcjpzooz yz kmjbmvhhzm zi ktocji kziyvio gzn xjpmn yz IND !"

On reprend lundi prochain en mars !
Pas de travail pour mieux réviser le bac 😉 Bon courage !