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


def decode(texte, decalage):
    """Renvoie une chaine de caractères décalés

        Attend une chaîne de caractères non accentués
        éventuellement vide : texte

        Un entier positif entre 0 et 25 : decalage
        
        Renvoie une chaîne de la même longueur avec des caractères
        décalés de ... decalage, et ramenés dans l'alphabet
        en revenant de 26si on dépasse z ou Z

        Garde les caractères non alphabétiques
    """
        
    # Une chaîne vide à compléter au fur et à mesure
    resultat = ""

    # On parcourt la chaîne texte
    for lettre in texte :

        # décalage -> new est un code ASCII
        new = ord(lettre) + decalage
        
        if 65 <= ord(lettre) <= 90 :    # si minuscule
            if new > 90 :               # dépassement du z ?
                new -= 26
            resultat += chr(new)        # on rajoute le caractère décalé
        elif 97 <= ord(lettre) <= 122 : # si majuscule
            if new > 122 :              # dépassement du Z ?
                new -= 26
            resultat += chr(new)        # on rajoute le caractère décalé
        else :
            resultat += lettre   # on rajoute le caractère non décalé

    # On renvoie la nouvelle chaîne
    return resultat
# Des tests !
assert decode("", 5) == ""
assert decode("Ac Z!", 5) == "Fh E!"

###################################################################

# Décodage de ce mot :

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

for d in range(1,26):
    print(decode(mot, d))

###########################################################
Mqa y'aop ydkqappa za lnkcnwiian aj lupdkj lajzwjp hao ykqno za JOE !
Nrb z'bpq zelrbqqb ab moldoxjjbo bk mvqelk mbkaxkq ibp zlrop ab KPF !
Osc a'cqr afmscrrc bc npmepykkcp cl nwrfml nclbylr jcq amspq bc LQG !
Ptd b'drs bgntdssd cd oqnfqzlldq dm oxsgnm odmczms kdr bntqr cd MRH !
Que c'est chouette de programmer en python pendant les cours de NSI !
Rvf d'ftu dipvfuuf ef qsphsbnnfs fo qzuipo qfoebou mft dpvst ef OTJ !
Swg e'guv ejqwgvvg fg rtqitcoogt gp ravjqp rgpfcpv ngu eqwtu fg PUK !
Txh f'hvw fkrxhwwh gh surjudpphu hq sbwkrq shqgdqw ohv frxuv gh QVL !
Uyi g'iwx glsyixxi hi tvskveqqiv ir tcxlsr tirherx piw gsyvw hi RWM !
Vzj h'jxy hmtzjyyj ij uwtlwfrrjw js udymts ujsifsy qjx htzwx ij SXN !
Wak i'kyz inuakzzk jk vxumxgsskx kt veznut vktjgtz rky iuaxy jk TYO !
Xbl j'lza jovblaal kl wyvnyhttly lu wfaovu wlukhua slz jvbyz kl UZP !
Ycm k'mab kpwcmbbm lm xzwoziuumz mv xgbpwv xmvlivb tma kwcza lm VAQ !
Zdn l'nbc lqxdnccn mn yaxpajvvna nw yhcqxw ynwmjwc unb lxdab mn WBR !
Aeo m'ocd mryeoddo no zbyqbkwwob ox zidryx zoxnkxd voc myebc no XCS !
Bfp n'pde nszfpeep op aczrclxxpc py ajeszy apyolye wpd nzfcd op YDT !
Cgq o'qef otagqffq pq bdasdmyyqd qz bkftaz bqzpmzf xqe oagde pq ZEU !
Dhr p'rfg pubhrggr qr cebtenzzre ra clguba craqnag yrf pbhef qr AFV !
Eis q'sgh qvcishhs rs dfcufoaasf sb dmhvcb dsbrobh zsg qcifg rs BGW !
Fjt r'thi rwdjtiit st egdvgpbbtg tc eniwdc etcspci ath rdjgh st CHX !
Gku s'uij sxekujju tu fhewhqccuh ud fojxed fudtqdj bui sekhi tu DIY !
Hlv t'vjk tyflvkkv uv gifxirddvi ve gpkyfe gveurek cvj tflij uv EJZ !
Imw u'wkl uzgmwllw vw hjgyjseewj wf hqlzgf hwfvsfl dwk ugmjk vw FKA !
Jnx v'xlm vahnxmmx wx ikhzktffxk xg irmahg ixgwtgm exl vhnkl wx GLB !
Koy w'ymn wbioynny xy jlialuggyl yh jsnbih jyhxuhn fym wiolm xy HMC !

N'hésitez-pas à poser une question, ou faire avancer le schmilblick

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.