L'objet deque
Problématique
Vous souhaitez créer un programme permettant le chiffrement de Porta, et l'objet deque est là pour vous aider,
Tout d'abord une petite visite vers le tutoriel de Sakarov concernant le chiffre de Porta -> ICI
L'objectif est de savoir comment faire une rotation par pas de 1 de l'ensemble des caractères de la 2ème ligne de chaque groupe. C'est à dire comment passer de
nopqrstuvwxyz
à
znopqrstuvwxy
yznopqrstuvwx
xyznopqrstuvw
wxyznopqrstuv
vwxyznopqrstu
uvwxyznopqrst
tuvwxyznopqrs
stuvwxyznopqr
rstuvwxyznopq
qrstuvwxyznop
pqrstuvwxyzno
opqrstuvwxyzn
nopqrstuvwxyz
Ne vous inquiétez pas, je ne me suis pas amusé à tout écrire à la main
Construire un objet deque
Rien de plus simple, regardez !
Code:
from collections import deque alphabets = deque(['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'])
Pour créer cette rotation on va utiliser sa méthode rotate
Code:
alphabets.rotate(1)
Code:
from collections import deque alphabets = deque(['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']) for i in range(13): alphabets.rotate(1) # 1 rotation print(alphabets)
term.jpg
Aide à la résolution
On a 13 groupes AB, CD, EF, ... qu'on va créer ainsi
A vaut 65 en code ascii et je dois aller jusqu'à Z qui vaut 90, donc les groupes donneront (65, 66), (67, 68), ... vous voyez l'astuce ?
Code:
Pour i allant de 65 à 89 et par pas de 2 groupe = (i, i+1) ajouter groupe dans la liste de groupes
Code:
groupes = [] for i in range(65, 90, 2): groupe = (i, i+1) groupes.append(groupe) print(groupes)
Code:
[(65, 66), (67, 68), (69, 70), (71, 72), (73, 74), (75, 76), (77, 78), (79, 80), (81, 82), (83, 84), (85, 86), (87, 88), (89, 90)]
Code:
groupes = [] for i in range(65, 90, 2): groupe = (chr(i), chr(i+1)) groupes.append(groupe) print(groupes)
Code:
[('A', 'B'), ('C', 'D'), ('E', 'F'), ('G', 'H'), ('I', 'J'), ('K', 'L'), ('M', 'N'), ('O', 'P'), ('Q', 'R'), ('S', 'T'), ('U', 'V'), ('W', 'X'), ('Y', 'Z')]
On peut écrire tout cela en une ligne, une fois qu'on a vérifié que notre algo est fonctionnel
Code:
groupes = [(chr(i), chr(i+1)) for i in range(65, 90, 2)]
Création des 2 lignes d'alphabet
AB -> (abcdefghijklm, nopqrstuvwxyz)
CD -> (abcdefghijklm, znopqrstuvwxy)
...
Je crée un dictionnaire,
Code:
correspondance = {('A', 'B'): ('abcdefghijklm', 'nopqrstuvwxyz'), ('C', 'D'): ('abcdefghijklm', 'znopqrstuvwxy'), ....}
Code:
from collections import deque groupes = [''.join((chr(i), chr(i+1))) for i in range(65, 90, 2)] alpha_maitre = 'abcdefghijklm' alpha_esclave = deque('nopqrstuvwxyz') correspondance = {} for groupe in groupes: alpha_esclave_string = ''.join(alpha_esclave) correspondance[groupe] = (alpha_maitre, alpha_esclave_string) alpha_esclave.rotate(1) print(correspondance)
Code:
{'EF': ('abcdefghijklm', 'yznopqrstuvwx'), 'QR': ('abcdefghijklm', 'stuvwxyznopqr'), 'KL': ('abcdefghijklm', 'vwxyznopqrstu'), 'YZ': ('abcdefghijklm', 'opqrstuvwxyzn'), 'IJ': ('abcdefghijklm', 'wxyznopqrstuv'), 'GH': ('abcdefghijklm', 'xyznopqrstuvw'), 'ST': ('abcdefghijklm', 'rstuvwxyznopq'), 'UV': ('abcdefghijklm', 'qrstuvwxyznop'), 'AB': ('abcdefghijklm', 'nopqrstuvwxyz'), 'CD': ('abcdefghijklm', 'znopqrstuvwxy'), 'WX': ('abcdefghijklm', 'pqrstuvwxyzno'), 'MN': ('abcdefghijklm', 'uvwxyznopqrst'), 'OP': ('abcdefghijklm', 'tuvwxyznopqrs')}
Voilà votre tableau de correspondance, je vous laisse faire la suite, le plus simple quoi
Bonne continuation...
Commentaire