#
# Question 1
#
def recherche_occurrence_par_valeur(L : list, n : int):
    for e in L:
        if e == n:
            return True
    return False

assert recherche_occurrence_par_valeur([0,1,2,3,4], 5) == False
assert recherche_occurrence_par_valeur([0,1,2,3,4], 2) == True

def recherche_occurrence_par_indice(L : list, n : int):
    for i in range(len(L)):
        if L[i] == n:
            return True
    return False

assert recherche_occurrence_par_indice([0,1,2,3,4], 5) == False
assert recherche_occurrence_par_indice([0,1,2,3,4], 2) == True

#
# Question 2
#
def somme_par_valeur(L : list):
    resultat = 0
    for e in L:
        resultat = resultat + e
    return resultat

assert somme_par_valeur([0,1,2,3,4]) == 10
assert somme_par_valeur([0,1,-2,3,-4]) == -2

def somme_par_indice(L : list):
    resultat = 0
    for i in range(len(L)):
        resultat = resultat + L[i]
    return resultat
    
assert somme_par_indice([0,1,2,3,4]) == 10
assert somme_par_indice([0,1,-2,3,-4]) == -2

#
# Question 3
#

def produit(l):
    resultat = 1
    for e in l:
        resultat = resultat * e
    return resultat
    
assert produit([1, 2, 3, 4, 5]) == 120
assert produit([-1, -2, -3, -4, -5]) == -120

def factoriel(n):
    l = []
    for i in range(1, n+1):
        l.append(i)
    return produit(l)
    
assert factoriel(5) == 120

#
# Question 4
#

def moyenne(l):
    resultat = 0
    for e in l:
        resultat = resultat + e
    return resultat / len(l)
    
assert moyenne([11, 12, 13]) == 12.0

#
# Question 5
#

def minimum(l):
    valmin = l[0]
    for e in l:
        if e < valmin:
            valmin = e
    return valmin
    
assert minimum([2, 5, 3, 1, 4]) == 1
assert minimum([-2, -5, -3, -1, -4]) == -5


#
# Question 6
#

def maximum(l):
    valmax = l[0]
    for e in l:
        if e > valmax:
            valmax = e
    return valmax
    
assert maximum([2, 5, 3, 1, 4]) == 5
assert maximum([-2, -5, -3, -1, -4]) == -1


#
# Question 7
#

def indice_min(l):
    indice = 0
    for i in range(len(l)):
        if l[i] < l[indice]:
            indice = i
    return indice
    
assert indice_min([2, 5, 3, 1, 4]) == 3
assert indice_min([-2, -5, -3, -1, -4]) == 1


#
# Question 8
#

def indice_max(l):
    indice = 0
    for i in range(len(l)):
        if l[i] > l[indice]:
            indice = i
    return indice
    
assert indice_max([2, 5, 3, 1, 4]) == 1
assert indice_max([-2, -5, -3, -1, -4]) == 3

#
# Question 9
#

def nombre_occurrence(l, n):
    compteur = 0
    for e in l:
        if e == n:
            compteur = compteur + 1
    return compteur
    
assert nombre_occurrence([4, 2, 2, 3, 2, 4], 2) == 3
assert nombre_occurrence([4, 2, 2, 3, 2, 4], 3) == 1
assert nombre_occurrence([4, 2, 2, 3, 2, 4], 4) == 2

#
# Question 10
#

def indice_premiere_occurrence(l, n):
    for i in range(len(l)):
        if l[i] == n:
            return i
    return -1 # echec
    
assert indice_premiere_occurrence([4, 2, 2, 3, 2, 4], 2) == 1
assert indice_premiere_occurrence([4, 2, 2, 3, 2, 4], 3) == 3
assert indice_premiere_occurrence([4, 2, 2, 3, 2, 4], 4) == 0
assert indice_premiere_occurrence([4, 2, 2, 3, 2, 4], 5) == -1

# plusieurs façons de faire : 
# on peut parcourir la liste en partant du début et en mettant à jour l'indice à retourner à chaque nouvelle occurence rencontrée
# ou on peut parcourir la liste depuis la fin et retourner l'indice de la première occurence rencontrée (solution choisie)

def indice_derniere_occurence(l, n):
    for i in range(len(l)-1, -1, -1):
        if l[i] == n:
            return i
    return -1 # echec
    
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 2) == 4
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 3) == 3
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 4) == 5
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 5) == -1


def indice_derniere_occurence(l, n):
    resultat = []
    for i in range(len(l)):
        if l[i] == n:
            resultat.append(i)
    return resultat
    
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 2) == [1, 2, 4]
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 3) == [3]
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 4) == [0, 5]
assert indice_derniere_occurence([4, 2, 2, 3, 2, 4], 5) == []



