Annonce

Réduire
Aucune annonce.

L'objet Deque - chiffremet de Porta - COURS N°12

Réduire
Ceci est une discussion importante.
X
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • L'objet Deque - chiffremet de Porta - COURS N°12

    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'])
    Rotation d'un pas

    Pour créer cette rotation on va utiliser sa méthode rotate

    Code:
    alphabets.rotate(1)
    J'ai 13 lettres, 13 rotations, allons-y !

    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)
    Résultat

    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
    Ce qui donne en python

    Code:
    groupes = []
    for i in range(65, 90, 2):
        groupe = (i, i+1)
        groupes.append(groupe)
    
    print(groupes)
    Résulat:

    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)]
    Mais bon, faut assimiler des chiffres à des lettres, c'est pas très lisible, donc on va utiliser une fonction chr qui transcris du code ascii en littéral.

    Code:
    groupes = []
    for i in range(65, 90, 2):
        groupe = (chr(i), chr(i+1))
        groupes.append(groupe)
    
    print(groupes)
    Résultat:

    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')]
    Eurêka !!!

    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)]
    Voilà on a notre groupe...

    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'),
                             ....}
    Comment le créer sans trop se fatiguer ? Allez je le donne, si vous avez tout suivi, ça devrait aller pour comprendre

    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)
    Résultat:

    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')}
    Remarque: ''.join(iterable) veut simplement dire que je joins les espaces par rien du tout, c'est à dire que je les transforme par ''. Par exemple ('A', 'B') devient 'AB' ou ['m', 'n', 'o'] devient 'mno'. Les exemples c'est toujours sympa!

    Voilà votre tableau de correspondance, je vous laisse faire la suite, le plus simple quoi

    Bonne continuation...
    Dernière modification par fred, 03 juillet 2016, 16h35.

  • #2
    Salut Fred. Ce cours était le dernier? Pas de suite?? Merci

    Commentaire


    • #3
      Pas forcément, un jour où je serai plus motivé et où je ne serai pas débordé de boulot, ça reviendra peut-être... Mais en admettant que je m'y remette, que proposes-tu comme cours ?

      Commentaire

      Chargement...
      X