def clean(texte):
return sans_combi( texte.upper() )
# ou bien :
return sans_combi(texte).upper()
Chiffrement de C´esar
Il en existe 25 versions si on ne compte pas la fonction identit´e comme un chiffrement.
´
Ecrire une fonction cesar caractere(c,k) qui retourne le caract`ere cd´ecal´e de krangs dans l’alphabet
si c’est une lettre majuscule, et retourne cinchang´e sinon :
Pour tester si on a affaire `a une lettre majuscule, il suffit de v´erifier si son codepoint est entre 65
et 90. Ce test est plus rapide que de parcourir la liste des lettres majuscules pour v´erifier si cs’y
trouve. Concernant le d´ecalage de krangs, vous avez presque tous pu vous rendre compte qu’une
solution pas assez rigoureuse `a ce genre de question m`ene `a une longue s´eance de d´ebuggage. Donc
proc´edons m´ethodiquement : prenons notre lettre, et consid´erons son codepoint. Changeons-le en
un nombre entre 0 et 25 en retranchant 65. Ajoutons ket ramenons-nous dans l’intervalle [[0,25]] `a
l’aide de l’op´erateur modulo : %. Ajoutons 65 pour obtenir le codepoint de la lettre correspondante, et
appliquons chr pour avoir cette lettre :
def cesar_caractere(c,k):
codepoint=ord(c)
if codepoint <65or codepoint > 90:
return c
else :
numero=codepoint-65
numero_decale=(numero+65)%26
codepoint_decale=65+numero_decale
return chr(codepoint_decale)
Cette fonction fonctionne avec n’importe quel k∈Z.
´
Ecrire une fonction cesar(s,k) qui chiffre un texte avec le code de C´esar avec le d´ecalage fourni.
Comme pour retirer les caract`eres de combinaison, on avait le choix entre plein de variantes tr`es proches
les unes des autres. On pouvait it´erer sur la chaˆıne, ou sur ses indices, ou sur la liste de ses caract`eres,
et on pouvait construire directement une chaˆıne ou contruire une liste pour la rassembler ensuite. Par
exemple, en it´erant sur la chaˆıne et en construisant directement une chaˆıne :
def cesar(texte,k):
resultat=""
for cin texte:
resultat=resultat+cesar_caractere(c,k)
return resultat
ou bien en construisant une liste par compr´ehension pour ensuite la rassembler :
def cesar(texte,k):
liste_resultat=[cesar_caractere(c,k) for cin texte]
return rassembler(liste_resultat)
Pour d´ecoder un texte cod´e par un d´ecalage de k, on effectue un d´ecalage de −k.
Pour d´echiffrer le texte “V’XLM NG IXN VHNKM, CXNGX AHFFX”, on pouvait essayer les 26
d´ecalages possibles et trouver celui qui retournait un texte lisible.
3