''' TP1 - Correction '''

from random import random

''' Définitions des fonctions '''

# Exercice 1
def presentation():
    print("Bonjour, comment vous appelez-vous ?")
    nom = input()
    print("Enchanté",nom,"! Quel âge avez-vous ?")
    age = int(input())
    if age<18:
        print("J'espère que l'école se passe bien !")
    else:
        print("Je vois, donc vous êtes majeur.")
        
# Exercice 2
def SommeCarrés(n):
    res = 0
    for i in range(1,n+1):
        res += i*i
    return res

def EstPalindrome(s):
    n = len(s)//2
    for i in range(n):
        if s[i]!=s[-i-1]:
            return False
    return True

def occurences(x,tab):
    n = len(tab)
    res=[]
    for i in range(n):
        if tab[i]==x:
            res.append(i)
    return res
        
        
#Exercice 3
def EntierAleatoire(n):
    return int((n+1)*random())

def EntierMystere(n):
    x = EntierAleatoire(n)
    print("J’ai choisi un nombre mystère, essayez de le deviner !")
    print("Quel est le nombre mystère selon vous ?")
    y = int(input())
    while(x!=y):
        if x<y:
            print("Le nombre mystère est plus petit.")
        else:
            print("Le nombre mystère est plus grand.")
        print("Quel est le nombre mystère selon vous ?")
        y = int(input())
    print("Bravo, c'est la bonne réponse !")
    
    
#Exercice 4
    
def Add(A,B):
    n = len(A)
    m=len(A[0])
    res = [m*[0] for i in range(n)]
    for i in range(n):
        for j in range(n):
            res[i][j] = A[i][j]+B[i][j]
    return res
    
def Mult(A,B):
    n = len(A)
    res = [n*[0] for i in range(n)]
    for i in range(n):
        for j in range(n):
            for k in range(n):
                res[i][j] += A[i][k]*B[k][j]
    return res
        
def Puissance(A,n):
    if n==1:
        return A
    else:
        res = Puissance(A,n//2)
        res = Mult(res,res)
        if n%2==0:
            return Mult(A,res)
        else:
            return res
    

#Exercice 5
def EstPrésent(x,tab):
    debut=0
    fin=len(tab)-1
    if tab[debut]==x or tab[fin]==x:
        return True
    while fin-debut>1:
        middle=(fin+debut)//2
        if tab[middle]==x:
            return True
        if tab[middle]<x:
            debut=middle
        else:
            fin=middle
    return False

        
''' Tests '''

if __name__ == '__main__':
    
    #presentation()
    n=10
    print(SommeCarrés(n))
    print(EstPalindrome("coucou"))
    print(EstPalindrome("kayak"))
    print(EstPalindrome("abcdba"))
    
    tab = [1,3,4,1,2,5,3,1,2,1,1]
    
    print(occurences(1,tab))
    
    for i in range(30):
        print(EntierAleatoire(2))
        
    #EntierMystere(64)
        
    A=[[0,1],[1,1]]
    print(Puissance(A,10))
    
    tab=[1,2,4,7,12,15,23,24,25,97,123,128,132,197,198]
    print(EstPrésent(15,tab))
    print(EstPrésent(16,tab))