## Exercice 1 — print ou return

# f(4) affiche 27 (et « renvoie » 27).
# g(4) affiche 27 mais renvoie None.
# x = f(4) : x vaut 27.
# y = g(4) : y vaut None (et 27 est affiché au passage).
# x + y déclenche TypeError : on ne peut pas additionner un int et None.
# return produit une valeur réutilisable ; print n'affiche que à l'écran.
# Pour enchaîner des fonctions, il faut return.

from math import sqrt

def discriminant(a, b, c):
    delta = b**2 - 4 * a * c
    return delta

def solutions(a, b, c):
    delta = discriminant(a, b, c)
    if delta > 0:
        x1 = (-b - sqrt(delta)) / (2 * a)
        x2 = (-b + sqrt(delta)) / (2 * a)
        return [x1, x2]
    elif delta == 0:
        x0 = -b / (2 * a)
        return [x0]
    else:
        return []

## Exercice 2 — factorielle

def factorielle(n):
    P = 1
    for k in range(1, n + 1):
        P = P * k
    return P

## Exercice 3 — somme_carres

def somme_carres(n):
    S = 0
    for k in range(1, n + 1):
        S = S + k**2
    return S

## Exercice 4 — suite_u

def suite_u(n):
    u = 3
    for i in range(n):
        u = 2 * u - 1
    return u

#### Mini-projet : calendrier

## Exercice 5 — bissextile

def bissextile(annee):
    return (annee % 4 == 0 and annee % 100 != 0) or (annee % 400 == 0)

## Exercice 6 — nb_jours_annee

def nb_jours_annee(annee):
    if bissextile(annee):
        return 366
    return 365

## Exercice 7 — nb_jours_mois

def nb_jours_mois(mois, annee):
    if mois in (1, 3, 5, 7, 8, 10, 12):
        return 31
    if mois in (4, 6, 9, 11):
        return 30
    return 29 if bissextile(annee) else 28

## Exercice 8 — nb_jours_ecoules

def nb_jours_ecoules(jour, mois, annee):
    n = jour
    for m in range(1, mois):
        n = n + nb_jours_mois(m, annee)
    for a in range(1, annee):
        n = n + nb_jours_annee(a)
    return n

## Exercice 9 — difference_de_jours

def difference_de_jours(date1, date2):
    j1, m1, a1 = date1
    j2, m2, a2 = date2
    return abs(nb_jours_ecoules(j2, m2, a2) - nb_jours_ecoules(j1, m1, a1))

## Exercice 10 — date

def date(n):
    annee = 1
    while n > nb_jours_annee(annee):
        n = n - nb_jours_annee(annee)
        annee = annee + 1
    mois = 1
    while n > nb_jours_mois(mois, annee):
        n = n - nb_jours_mois(mois, annee)
        mois = mois + 1
    return [n, mois, annee]

## Exercice 11 — jour_de_la_semaine

def jour_de_la_semaine(jour, mois, annee):
    noms = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]
    # Le 1er janvier de l'an 1 est un lundi : jour 1 -> indice 0
    return noms[(nb_jours_ecoules(jour, mois, annee) - 1) % 7]

## Exercice 12 — prochain_vendredi_13

def prochain_vendredi_13(jour, mois, annee):
    n = nb_jours_ecoules(jour, mois, annee) + 1
    while True:
        j, m, a = date(n)
        if j == 13 and jour_de_la_semaine(j, m, a) == "Vendredi":
            return [j, m, a]
        n = n + 1
