## Ex1 Q1

def plus_proche(L) :
    n = len(L)
    min = abs(L[0]-L[1])
    (a,b) = (L[0],L[1])
    for i in range(n) :
        for j in range(i) :
            d = abs(L[j]-L[i])
            if d < min :
                min = d
                (a,b) = (L[i],L[j])
    return (a,b)


def plus_proche(L) :
    n = len(L)
    min = abs(L[0]-L[1])
    (a,b) = (L[0],L[1])
    for i in range(n) :
        for j in range(i+1, n) :
            d = abs(L[j]-L[i])
            if d < min :
                min = d
                (a,b) = (L[i],L[j])
    return (a,b)
















## Ex1 Q3
# A faire en exo
# def distance(A,B) :

def distance(A, B):
    '''
    A est un couple(tuple) de réels
    B est un couple(tuple) de réels
    distance retourne la distance euclidienne entre les points A et B
    '''
    return ((A[0] - B[0])**2 + (A[1] - B[1])**2)**(0.5)

def plus_proche_point(L) :
    n = len(L)
    min = distance(L[0],L[1])
    (a,b) = (L[0],L[1])
    for i in range(n) :
        for j in range(i) :
            d = distance(L[i],L[j])
            if d < min :
                min = d
                (a,b) = (L[i],L[j])
    return (a,b)




## Ex2
def doublon(L) :
    n = len(L)
    for i in range(n-1) :
        for j in range(i+1,n) :
            if L[i] == L[j] :
                return True
    return False





## Ex3 Q1

def Occurrence_Lettre(c,t) :
    Ind = []
    n = len(t)
    for i in range(n) :
        if t[i] == c :
            Ind.append(i)
    return Ind














## Ex3 Q2


def RechercheNaive(mot,texte) :
    n = len(texte)
    m = len(mot)
    Ind = []
    for i in range(n-m+1) :
        c=0
        for j in range(m) :
            if texte[i+j] != mot[j] :
                break
            c=c+1
        if c == m : # mot présent en i
            Ind.append(i)
    return Ind







def RechercheNaive2(mot,texte) :
    n = len(texte)
    m = len(mot)
    Ind = []
    for i in range(n-m+1) :
        c=0
        for j in range(m) :
            if texte[i+j] == mot[j] :
                c=c+1
        if c == m : # mot présent en i
            Ind.append(i)
    return Ind










## Ex4 Q2



#
def Tri_Bulle(L) :
    n = len(L)
    for j in range(n-1) :
        for i in range(n-1) :
            if L[i]>L[i+1] :
                L[i],L[i+1] = L[i+1],L[i]


#
def tribulle(L):
    for i in range(len(L)-1):
        for j in range(len(L)-1-i):
            if L[j]>L[j+1]:
                L[j], L[j+1] = L[j+1], L[j]
    return L



#
def Tri_Bulle_2(L) :
    n = len(L)
    for i in range(n-1,0,-1) :
        for j in range(i) :
            if L[j+1] < L[j] :
                L[j+1],L[j] = L[j],L[j+1]
    return L














def Tri_Bulle_3(L) :
    n = len(L)
    for i in range(n-1,0,-1) :
        echange = 0
        for j in range(i) :
            if L[j+1] < L[j] :
                L[j+1],L[j] = L[j],L[j+1]
                echange = 1
        if echange == 0:
            return L
    return L




























