Après avoir tapé le code dans une cellule pour l'exécuter tapez Shift+Entré
et l'ordinateur calcule le résultat.
Le code doit être correctement indenté (pour préciser l'intérieur des boucles ou des tests).
Une variable peut être: déclarée, affectée, appelée.
range(20)
désigne l'intervalle des nombres entiers de 0 (inclus) à 20 (exclu). range(1,20)
désigne l'intervalle des nombres entiers de 1 (inclus) à 20 (exclu).
Nous avons vu la semaine dernière comment manipuler les chaines de caractères:
m="abracadabra" result="" for i in range(len(m)): if m[i]=='a': result = result + 'o' else: result = result + m[i] print(result)
Vous utiliserez aussi les fonctions qui transforment un caractère en un nombre dans la table ASCII : chr(72)
et ord('d')
Affichez les caractères dont pour les codes ascii entre 32 et 126:
for i in range(32,127): print(chr(i))
(Vous pouvez utliser l'option sep=''
de la fonction print
pour les afficher en ligne.)
Comme chez les jeunes scout-es et autres éclaireu-ses/rs, la phrase suivante a été codée avec le codage avocat (A vaut K, brillant jeu de mot). C'est à dire que les A ont été remplacé par des K, les B par des L, les C par des M, etc.
En utilisant les fonctions chr()
, ord()
et les calculs modulo 26 (avec le symbole d'opération %
), retrouvez le message original. Attention, aux parenthèses entre ces différentes opérations. Tatonnez un peu.
message="VKWOBOCDVOMSWODSOBONEMRKDOKENSP"
Un autre codage à la mode chez les enfants est le codage cassette (K7 ou encore K=7), où le K est remplacé par un 7, le L par un 8, le M par un 9, etc.
Voici donc un autre message à décoder:
message = [8, 1, 24, 11, 10, 15, 1, 10, 15, 1, 15, 16, 8, 23, 25] message += [4, 11, 15, 1, 0, 17, 9, 11, 10, 0, 1, 8, 23, 9, 5, 1] message += [17, 20, 12, 23, 14, 16, 23, 3, 1, 1]
Évidemment, on ne trouve pas, en général, la manière de décoder un message avec le message codé...
Mais, les langues humaines ne sont pas du tout des suites aléatoires de lettres. En particulier en français le E est la lettre la plus fréquente: 17,26% des caractères d'un texte en français sont des E.
Voici donc un message.
message="FZCFRJXGNJSXSJJXQFAFQJZWSFYYJSIUFXQJSTRGWJIJXFSSJJX"
Quelle est la lettre la plus fréquente ? Il va vous falloir programmer pour parcourir cette chaine de caractère et pour chaque caractère compter son nombre d'occurences. Créez donc une liste occurence qui pour chaque lettre de 0 à 25 vous donne son nombre d'occurences, par exemple occurence[2]==1
car il y a un seul C dans message
. Puis il faut chercher l'indice du plus grand des nombres d'occurences et donner la lettre correspondante.
On donne une indication: le message a été codé par décalage (quelque chose de semblable à avocat ou cassette) mais ici vous ne savez pas quel est le décalage. Grâce à la lettre la plus fréquente qui doit coder le E, décoder le message.
Et si on enroulait la bande du message autour d'un crayon ?
Dans le message ci-dessous, on a écrit une lettre toutes les 7 posititions, si bien que "bonjour" devient "bxxxxxxoxxxxxxnxxxxxxjxxxxxxoxxxxxxuxxxxxxr".
Saurez-vous retrouver le message ?
message="Anda e c'crsoceaao ne tisp reotelgtnm auaa etuslimso one ubmpsmpsr" message+="oa eu ilij rlsltotseee ue.s sdrm d,aspApe n,sulvls xaee sq nn uuu" message+="csagnr'h,ie uo tlmlnsd oaeeeudn sjnodsd aenetul n eresfadpesili" message+="ept ut eeppt p, leeuu cuu nrles de al se e ebe tsnsancrpetnsraaieai" message+="incg.lbssee eltp Tseaaeeo,slrtfu .e ftl;"
Votre mission, maintenant, si vous l'acceptez est de décrypter le message suivant:
G LPKKNVAH RL BALYG RNAN LCLPO OFVWFVAH CNPKKN HVA RFP LCNZ VYN GNKPZLONHHN OAFM OPRFANN MFVA TVN WN YN ZAVHHN MLH TVN K NYHNRSKN GNH ZIFHNH TV FY YN GFPO MLH ULPAN NHO PYGPCPHPSKN NO TVN GNH WNVYNH UPKKNH TVP RLYTVNYO GN ANHMNZO L KL CPNPKKNHHN UVHHNYO OFVO G VY ZFVM LAANONNH MLA GNH HZAVMVKNH TVLYG PK H LBPO GN MKLPHPAH MKVH ONYOLONVAH TVN GN HLVONA MLA GNHHVH VY FZOFBNYLPAN
Vous pouvez commencer par créer une grande chaine de caractère message
(en utilisant la somme des chaines de caractères pour ne pas les copier-coller toutes d'un coup).
Le seul indice dont vous disposez pour votre travail d'espion-ne est que le message est écrit en français sans accents, les espaces sont restés et il n'y a pas de signes de ponctuation. Chaque lettre en clair correspond à une lettre cryptée
Et les linguistes (et les joueuses de scrabble) vous diront qu'en français la fréquence des lettres n'est pas du tout uniforme:
E | A | S | I | N | T | R | L | U | O | D | C | P | M | V | G | F | B | Q | H | X | J | Y | Z | K | W |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
17,26 | 8,40 | 8,08 | 7,34 | 7,13 | 7,07 | 6,55 | 6,01 | 5,74 | 5,26 | 4,18 | 3,03 | 3,01 | 2,96 | 1,32 | 1,27 | 1,12 | 1,06 | 0,99 | 0,92 | 0,45 | 0,31 | 0,30 | 0,12 | 0,05 | 0,04 |
Les bigrammes les plus fréquents sont dans l'ordre décroissant :
ES DE LE EN RE NT ON ER TE EL AN SE ET LA AI IT ME OU EM IE
Quelle est la lettre la plus fréquente dans le message crypté ?
Vous pouvez commencer par tatonner. Ou bien vous pouvez faire une boucle pour afficher le nombre d'occurence (puis la fréquence)de chacune des 26 lettres de l'alphabet.
Essayez de remplacer la lettre la plus fréquente par des 'e' (minuscule pour bien voir la différence entre lettre cryptée et lettre en clair).
message[0]='d'
(oups je vous ai donné un indice).
Tiens, et pourquoi ne pas utiliser un dictionnaire pour se souvenir de la correspondance entre lettre cryptée et lettre en clair ?
decodage=dict() for i in range(26): decodage[chr(65+i)]=chr(65+i) decodage[' ']=' ' decodage['G']='d' message_clair="" for c in message: message_clair += decodage[c] print(message_clair)
Un autre message si quelqu'un évente le premier:
FGTSG POAMOGA EO NYRZ ZO SYGOT Z ORG EHHGIRHG IKFTGVOG EOAAI LIGR MOG KYTHGDDG KIAGTELDG VGRUGOT Z ORG POAHG MOGTGDDG GH KEDBGOTGOJ YLPGH Z ORG IRPOAHG TIUOGOT PG ZGKGOTG IKKYLIDG GH KYR EKG ELEHHOG SGZG EO SYOF MOI KG HOG AI FTGA ZG VYIT KYR NGO TGSYKFGRAG Y ZIGO D GHTERUG FGIRG GR SGH ENNTYRH KYR FGTG GAH D YNNGRAG GH D YNNGRAGOT DG FGTG ZG SBIKGRG