Chiffrement par décalage

Sujet

Alors que vous avez enfin trouvé le livre que vous cherchiez, il s’avère qu’il était complètement chiffré. Vous avez déjà réussi à déchiffrer la première page du livre, et celle-ci vous a indiqué le système de chiffrement utilisé dans le reste du livre.

La clé de chiffrement est ici un simple nombre, qu’on appelle D, pour « décalage ». On remplace alors chaque lettre de l’alphabet par la lettre située D places plus loin dans l’alphabet, considéré de manière circulaire.

Ainsi, si le décalage est de 2, alors

La clé utilisée pour chiffrer le texte change à chaque page et pour la page numéro XX elle vaut

À vous de déchiffrer tout le livre !

Contraintes

Chaque ligne contient au plus 1000 caractères.

Entrée

Le texte peut contenir des lettres, chiffres ou caractères de ponctuation, mais pas d’accents.

Sortie

Exemple


entrée :

4
Ikio kyz rg ykiutjk vgmk ja robxk
Npeep alrp pde wl alrp yfxpcz 3
Qf hauou pazo xm cgmfduqyq bmsq !

sortie :

Ceci est la seconde page du livre
Cette page est la page numero 3
Et voici donc la quatrieme page !

Solution

def déchiffre(lettre: str, clé: int) -> str:
    """
    Déchiffre la `lettre` en fonction de la `clé`.
    
    >>> déchiffre('A', 2)
    'C'
    
    >>> déchiffre('z', 2)
    'b'
    
    """
    def tourne_autour(lettre, pivot, clé):
        indice = ord(lettre) - ord(pivot)
        indice_déchiffré = (indice - clé) % 26
        return chr(ord(pivot) + indice_déchiffré)
    
    if 'a' <= lettre <= 'z':
        return tourne_autour(lettre, 'a', clé) # déchiffrement
    elif 'A' <= lettre <= 'Z':
        return tourne_autour(lettre, 'A', clé) 
    else:
        return lettre    # aucun changement

nb_pages = int(input())
for page in range(2, nb_pages + 1):
    ligne = input()
    clé = (-5 * page) if page % 2 == 1 else (3 * page)
    print("".join((déchiffre(lettre, clé) for lettre in ligne)))