



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

## Question 3.1

def mon_max(a,b):
    if a == None:
        return b
    elif b == None:
        return a
    else:
        return max(a,b)

def max_pair(liste):
    maximum = None
    for valeur in liste:
        if valeur%2==0:
            maximum = mon_max(maximum, valeur)
    if maximum == None:
        raise ValueError("Pas de valeur paire")
    return maximum

def max_pair(liste):
    déjà_trouvé = False
    maximum = None
    for valeur in liste:
        if valeur%2==0:
            if déjà_trouvé:
                maximum = max(maximum, valeur)
            else:
                maximum = valeur
                déjà_trouvé = True
    if not déjà_trouvé:
        raise ValueError("Pas de valeur paire")

    return maximum


## Question 3.2
def afficher_max_pair(liste):
    try:
        valeur = max_pair(liste)
        print("Le plus grand pair est", valeur)
    except:
        print("De la musique avant toute chose,")
        print("Et pour cela préfère l'Impair")
        print("Plus vague et plus soluble dans l’air,")
        print("Sans rien en lui qui pèse ou qui pose.")

##FINPROF

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

# Question 4-1
def est_triée(L) :
    for i in range(len(L)-1) :
        if L[i] > L[i+1] :
            return False
    return True

# Question 4-2
assert est_triée([]) == True
assert est_triée([1]) == True
assert est_triée([1,3,7]) == True
assert est_triée([12, 10]) == False
assert est_triée([1,2,6,12,78,70]) == False






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

## Question 5.1
def grouper(L) :
    if len(L) == 0 :
        return []
    e = L[0]
    res = [e]
    for i in range(1,len(L)) :
        if L[i] != e :
            e = L[i]
            res.append(e)
    return res


## Question 5.2
def compacter(L) :
    if len(L)==0 :
        return []
    # L contient au moins un élément
    e = L[0]
    c = 1
    res = []
    for i in range(1,len(L)) :
        if L[i] != e :
            res.append((c,e))
            e = L[i]
            c = 1
        else :
            c = c+1
    res.append((c,e))
    return res



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

## Question 6.1

def index_insertion(L,n) :
    for i in range(len(L)):
        if L[i]>n :
            return i
    return len(L)


## Question 6.2

def insertion_triée(L) :
    res = []
    for i in range(len(L)) :
        j = index_insertion(res,L[i])
        res.insert(j , L[i])
    return res
