




################
##            ##
## Exercice 3 ##
##            ##
################
print('\nExercice 3\n')

for i in range(32,127):
    if i<100:
        print(' ',end='')
    print(i,chr(i),sep=' ',end='  ')
    if (i+1)%8 == 0: # retour à la ligne tout les 8 symboles
        print('')
print()








################
##            ##
## Exercice 4 ##
##            ##
################
print('\nExercice 4\n')

# Question 4.1



print("Valrose\b\bZ\rP")


# Question 4.2


from time import sleep
film = [ "5 ", "4 ", "3 ", "2 ", "1 ", "BOUM !!!"]

# L’option flush est utile lorsqu’on lance le code en ligne de
# commande

def projeter(L):
    for i in range(len(L)):
        print(L[i],end="", flush=True)
        sleep(0.5)
        print("\b" * len(L[i]),end="", flush=True)
        print(" "  * len(L[i]),end="", flush=True)
        print("\r",end="", flush=True)

# projeter(film)



# Question 4.3


def fabriquer_film(n):
    pellicule = [""] * n
    for i in range(n):
        ch = ""
        for j in range(n):
            if i==j:
                ch = ch + "*"
            else:
                ch = ch + " "
        pellicule[i] = ch
    return pellicule


print(fabriquer_film(5))


def fabriquer_film(n):
    pellicule = [""] * n
    for i in range(n):
        pellicule[i] = i*" " + "*" + (n-i-1)*" "
    return pellicule

print(fabriquer_film(5))


# Question 4.4

def projeter_en_boucle(film,n):
    for i in range(n):
        projeter(film)
    print("Fin               ")

trop_beau = fabriquer_film(5)
projeter_en_boucle(trop_beau, 3)

for i  in range(len(trop_beau)):
    print(trop_beau[i])

# Question 4.5

def fabriquer_film_horreur(n):
    dracula = "\U0001f987"
    cimetière = "\U0001faa6"
    pellicule = [""] * n
    for i in range(n):
        pellicule[i] = i*cimetière + dracula + (n-i-1)*cimetière
    return pellicule


nosferatu = fabriquer_film_horreur(5)
projeter_en_boucle(nosferatu, 3)

for i  in range(len(nosferatu)):
    print(nosferatu[i])


# Question 4.6

def fabriquer_film_horreur_extended_version(n):
    dracula = "\U0001f987"
    cimetière = "\U0001faa6"
    pellicule = ["x"] * (2*n-2)
    for i in range(n-1):
        pellicule[i] = i*cimetière + dracula + (n-i-1)*cimetière
        pellicule[n+i-1] = (n-i-1)*cimetière + dracula + i*cimetière
    return pellicule


nosferatu_le_retour = fabriquer_film_horreur_extended_version(10)

for i  in range(len(nosferatu_le_retour)):
    print(nosferatu_le_retour[i])

projeter_en_boucle(nosferatu_le_retour, 2)


################
##            ##
## Exercice 5 ##
##            ##
################
print('\nExercice 5\n')


def rechercher(mot, texte):
    for i in range(len(texte) - len(mot)+1):
        trouvé=True
        for j in range(len(mot)):
            if mot[j] != texte[i+j]:
                trouvé = False
                break
        if trouvé:
            return i
    return -1

assert rechercher("toto", "toto") == 0
assert rechercher("toto", "rototo") == 2
assert rechercher("rototo", "roto") == -1


print("VIE  :", rechercher("vie", "L’olivier est un bel arbre"))
print("MORT :", rechercher("mort", "L’olivier est un bel arbre"))



################
##            ##
## Exercice 6 ##
##            ##
################
print('\nExercice 6\n')

## Question 6.1

def xor(c1, c2) :
    if c1 == c2:
        return '0'
    else:
        return '1'

for c1 in '01':
    for c2 in '01':
        print(c1,'xor',c2,'=',xor(c1,c2))


## Question 6.2


def chiffrement(m,k) :
    res = ''
    for i in range(len(m)) :
        c1=m[i]
        c2=k[i % len(k)]
        res = res + xor(c1,c2)
    return res

print(chiffrement('1110011','10') == '0100110')



## Question 6.3



def binaire_chiffre(n):
    res = ''
    bits="01"
    for i in range(4):
        q = n//2
        r = n%2
        res = bits[r] + res
        n = q
    return res


# binaire_chiffre #

for i in range(10):
    print(i,":",binaire_chiffre(i))

def binaire(s):
    res = ''
    for i in range(len(s)):
        c = int(s[i])
        res = res + binaire_chiffre(c)
    return res

print(binaire('0123'))



## Question 6.4

def ssid_valide(s):
    x = int(s[:13]) + int(s[13:])
    return (x % 97 == 0)

print(ssid_valide('255081416802538')==True)
print(ssid_valide('255081410802538')==False)





## Question 6.5






print("\nIl y dix possibilités à tester pour les 8 premiers chiffres (on connaît les sept premiers)")

nss = '101011110101101101111101110111111000001010101101001111111010'
début_nss = nss[:32] # les 32 premiers bits de nss
début = '1980106'

def décimale(s):
    c=0
    résultat=''
    for i in range(len(s)):
        c = 2*c +int(s[i])
        if i%4 == 3:
            résultat=résultat + str(c)
            c=0
    return résultat

print('255081416802538')
print(binaire('255081416802538'))
print(décimale(binaire('255081416802538')))


# nns debut_nss debut décimale#

# binaire_chiffre #

# binaire #

# Chiffrement #


for i in range(10):
    début_décimale = début+str(i)
    début_binaire = binaire(début_décimale)
    print(i,':',début_décimale,début_binaire)


print("\nCe qui nous donne dix clés à tester")
# nns debut_nss debut décimale#

# binaire_chiffre #

# binaire #

# Chiffrement #


for i in range(10):
    début_décimale = début+str(i)
    début_binaire = binaire(début_décimale)
    clé = chiffrement(début_binaire,début_nss)
    print(i,':',début_décimale,début_binaire,"clé =",clé)


print("\nRegardons celles qui permettent d’obtenir un numéro de sécurité sociale valide\n")




for i in range(10):
    print("= Essai numéro",i, 65*"=")
    début_décimale = début+str(i)
    début_binaire = binaire(début_décimale)
    clé = chiffrement(début_binaire,début_nss)
    print(début_décimale,début_binaire,"clé =",clé)
    ssid_binaire_complet = chiffrement(nss,clé)
    ssid_décimale_complet = décimale(chiffrement(nss,clé))
    print("ssid potentiel :",ssid_binaire_complet)
    if ssid_valide(ssid_décimale_complet):
        print("\n"+ssid_décimale_complet+" est un numéro de sécurité sociale valide\n")
    else:
        print(ssid_décimale_complet,"n'est pas un numéro de sécurité sociale valide\n")


# xor #

# nns debut_nss debut décimale#

# binaire_chiffre #

# binaire #

# Chiffrement #

# ssid_valide #

# boucle for principale #

