#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May 12 10:44:43 2026

@author: pjoulaud
"""

# for i in range(13):
#     print(i%5+1, end='')
#     print(" ...", end='')
    
for i in range(13):
    print(f"... {i%5+1}", end='')
print()

import string
from string import ascii_uppercase as majuscules

for i in range(200):
    print(string.ascii_lowercase[i%26], end="")
print()

for i in range(200):
    if 0<=i%26<=3:
        print(string.ascii_lowercase[i%26], end="")
    elif i%26<=6 :
        print('.', end='')
    elif i%26>22 :
        print(string.ascii_lowercase[i%26], end="")
print()


def num_lettre(l:str)->int :
    i = 1
    for elem in string.ascii_uppercase :
        if elem == l :
            return i
        i += 1
    return None

def num_lettre2(l:str)->int :
    return string.ascii_uppercase.find(l)

def codage_cesar(chaine:str, decalage=3)-> str :
    reponse = ""
    for l in chaine :
        if l in string.ascii_uppercase :
            numero = num_lettre(l)
            numero = (numero + decalage)%26
            c = string.ascii_uppercase[numero]
            reponse += c
        else :
            reponse += l
    return reponse

def decodage_cesar(chaine:str, decalage=3)->str:
    return codage_cesar(chaine, -decalage)

def codage_inverse(chaine:str)-> str :
    reponse = ""
    for l in chaine :
        if l in string.ascii_uppercase :
            numero = num_lettre(l)
            numero = 26-numero-1
            c = string.ascii_uppercase[numero]
            reponse += c
        else :
            reponse += l
    return reponse

import random

def genere_table()->dict:
    dico_correspondances = {' ': ' '}
    les_lettres = list(string.ascii_uppercase)
    for l in string.ascii_uppercase :
        nb = random.randint(0, len(les_lettres)-1)
        dico_correspondances[l] = les_lettres.pop(nb)
    return dico_correspondances
    
def genere_table2()->dict:
    dico_correspondances = {' ': ' '}
    les_lettres = list(string.ascii_uppercase)
    les_lettres2 = list(string.ascii_uppercase)
    random.shuffle(les_lettres2)
    for i in range(len(les_lettres)) :
        dico_correspondances[les_lettres[i]] = les_lettres2[i]
    return dico_correspondances
    
def genere_table3()->dict:
    dico_correspondances = {' ': ' '}
    les_lettres = list(string.ascii_uppercase)
    les_lettres2 = list(string.ascii_uppercase)
    random.shuffle(les_lettres2)
    for l1, l2 in zip(les_lettres, les_lettres2) :
        dico_correspondances[l1] = l2
    return dico_correspondances    
    
  
def codage(chaine:str, table)->str:
      code = ""
      for l in chaine :
          code += table[l]
      return code

def decodage(chaine:str, table)->str:
      code = ""
      for l in chaine :
          for k in table.keys():
              if table[k]==l:
                  code += k
      return code

def codage_cle_chiffrement(chaine:str, code:str)-> str :
    reponse = ""
    i = 0
    for l in chaine :
        if l in string.ascii_uppercase :
            numero = num_lettre(l)
            num_code = num_lettre(code[i%7])
            numero = (numero + num_code)%26-1
            c = string.ascii_uppercase[numero]
            reponse += c
            i = i + 1
        else :
            reponse += l
    return reponse

def codage_cle_chiffrement2(chaine:str, code:str, decodage=False)-> str :
    reponse = ""
    i = 0
    for l in chaine :
        if l in majuscules :
            if not decodage :
                reponse += majuscules[(num_lettre(l) + num_lettre(code[i%7]))%26-1]
            else :
                reponse += majuscules[(num_lettre(l) - num_lettre(code[i%7]))%26-1]
            i = i + 1
        else :
            reponse += l
    return reponse

def decodage_cle_chiffrement(chaine:str, code:str)-> str :
    reponse = ""
    i = 0
    for l in chaine :
        if l in string.ascii_uppercase :
            numero = num_lettre(l)
            num_code = num_lettre(code[i%7])
            numero = (numero - num_code)%26-1
            c = string.ascii_uppercase[numero]
            reponse += c
            i = i + 1
        else :
            reponse += l
    return reponse

ma_table = genere_table() 
print(ma_table)
message = "BONJOUR"
toto = codage(message, ma_table)
print("code", toto)
toto2 = decodage(toto, ma_table)
print("message", toto2)
toto_poly = codage_cle_chiffrement2("JE TIENS ENFIN LA GAULE", "SCIENCE")
print(toto_poly)
print(codage_cle_chiffrement2(toto_poly, "SCIENCE", decodage=True))








