##################
##              ##
##  Exercice 2  ##
##              ##
##################
print('\nExercice 2\n')

# Première approche. On crée un variable k pour parcourir la liste L
def concatener(L1,L2):
    n = len(L1) + len(L2)
    L = [0] * n

    k=0 # indice dans L
    for i in range(len(L1)):
        L[k] = L1[i]
        k = k+1

    for i in range(len(L2)):
        L[k] = L2[i]
        k = k+1
    return L

# Deuxième approche. On ne crée pas de variable k mais on trouve une
# formule (i + len(L1) pour le décalage de l’indice dans L à partir de
# l’indice de L2.

def concatener_bis(L1,L2):
    n = len(L1) + len(L2)
    L = [0] * n

    for i in range(len(L1)):
        L[i] = L1[i]

    for i in range(len(L2)):
        L[i+ len(L1)] = L2[i]
    return L

assert concatener([1,2,3], [4,5,6,7]) == [1,2,3] + [4,5,6,7]
assert concatener_bis([1,2,3], [4,5,6,7]) == [1,2,3] + [4,5,6,7]

L1 = [1,2,3]
L2 = [4,5,6,7]
print(L1, "+", L2, "==", concatener(L1,L2))


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

## Question 3.1

def car(b):
    if b:
        return "T"
    else:
        return "F"

## Question 3.2

def formule(a,b):
    return not (a and b)


def tables_2_vérité(formule):
    booléens = [True, False]
    print("a b P")
    for i in range(len(booléens)):
        for j in range(len(booléens)):
            a = booléens[i]
            b = booléens[j]
            print(car(a),car(b), car(formule(a,b)))

tables_2_vérité(formule)


## Question 3.3
def tables_3_vérité(formule):
    booléens = [True, False]
    print("a b c P")
    for i in range(len(booléens)):
        for j in range(len(booléens)):
            for k in range(len(booléens)):
                a = booléens[i]
                b = booléens[j]
                c = booléens[k]
                print(car(a),car(b), car(c), car(formule(a,b,c)))

def formule(a,b,c):
    return (a or not c) and (not a or b) and (not b or c)






tables_3_vérité(formule)

## Question 3.4
def égalité(f1,f2):
    booléens = [True, False]
    for i in range(len(booléens)):
        for j in range(len(booléens)):
            a = booléens[i]
            b = booléens[j]
            if f1(a,b) != f2(a,b):
                return False
    return True


## Question 3.5
def f1(a,b):
    return not (a and b)

def f2(a,b):
    return not a or not b

def g1(a,b):
    return not (a or b)

def g2(a,b):
    return not a and not b

assert égalité(f1,f2)
assert égalité(g1,g2)


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

proust = "Mais au lieu de la simplicité, c'est le faste que je mettais au plus haut rang, si, après que j'avais forcé Françoise, qui n'en pouvait plus et disait que les jambes \"lui rentraient\", à faire les cent pas pendant une heure, je voyais enfin, débouchant de l'allée qui vient de la Porte Dauphine - image pour moi d'un prestige royal, d'une arrivée souveraine telle qu'aucune reine véritable n'a pu m'en donner l'impression dans la suite, parce que j'avais de leur pouvoir une notion moins vague et plus expérimentale, - emportée par le vol de deux chevaux ardents, minces et contournés comme on en voit dans les dessins de Constantin Guys, portant établi sur son siège un énorme cocher fourré comme un cosaque, à côté d'un petit groom rappelant le tigre de feu Baudenord, je voyais - ou plutôt je sentais imprimer sa forme dans mon coeur par une nette et épuisante blessure - une incomparable victoria, à dessein un peu haute et laissant passer à travers son luxe dernier cri des allusions aux formes anciennes, au fond de laquelle reposait avec abandon Mme Swann, ses cheveux maintenant blonds avec une seule mèche grise ceints d'un mince bandeau de fleurs, le plus souvent des violettes, d'où descendaient de longs voiles, à la main une ombrelle mauve, aux lèvres un sourire ambigu où je ne voyais que la bienveillance d'une Majesté et où il y avait surtout la provocation de la cocotte, et qu'elle inclinait avec douceur sur les personnes qui la saluaient."

def justification_à_gauche(s,n) :
    mot = ''
    ligne = ''
    taille_ligne = 0
    taille_mot = 0
    for i in range(len(s)) :
        if s[i] != ' ' : # Si on est à l'intérieur d'un mot
            mot = mot + s[i]
            taille_mot = taille_mot + 1
        else : # Si on a fini de lire un mot
            if taille_ligne+taille_mot+1 <= n and taille_ligne > 0 :
                # Si le mot rentre dans la ligne
                ligne = ligne + ' ' + mot
                taille_ligne = taille_ligne + taille_mot + 1
            else :
                # Sinon, on commence une nouvelle ligne
                if taille_ligne > 0 :
                    print(ligne)
                ligne = mot
                taille_ligne = taille_mot
            # On remet mot et taille_mot à zéro
            mot = ''
            taille_mot = 0
    # Il reste à s'occuper du dernier mot
    if taille_ligne + taille_mot != 0 :
        if taille_ligne + taille_mot > n :
            print(ligne)
            print(mot)
        else :
            print(ligne,mot)


justification_à_gauche(proust,80)
justification_à_gauche(proust,40)




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

def étoile():
    print("*",end='')

def dièse():
    print("#",end='')

def nouvelle_ligne():
    print("")

def tapis_a(largeur,hauteur):
    for i in range(hauteur):
        for j in range(largeur):
            étoile()
        nouvelle_ligne()

def tapis_b(largeur,hauteur):
    for i in range(hauteur):
        for j in range(largeur):
            if j%2==0: # colonne pair
                étoile()
            else: # colonne impair
                dièse()
        nouvelle_ligne()


def tapis_c(largeur,hauteur):
    for i in range(hauteur):
        for j in range(largeur):
            if i%2==0: # ligne pair
                if j%2==0: # colonne pair
                    étoile()
                else:      # colonne impair
                    dièse()
            else: # ligne impair
                if j%2==0: # colonne pair
                    dièse()
                else:      # colonne impair
                    étoile()
        nouvelle_ligne()


def tapis_d(largeur,hauteur):
    for i in range(hauteur):
        for j in range(largeur):
            if i%3==0: # première ligne
                if j%2==0: # colonne pair
                    étoile()
                else:      # colonne impair
                    dièse()
            elif i%3==1: # seconde ligne
                if j%2==0: # colonne pair
                    dièse()
                else:      # colonne impair
                    étoile()
            else: # troisième ligne
                étoile()
        nouvelle_ligne()

tapis_a(10,10)
print('')
tapis_b(10,10)
print('')
tapis_c(10,10)
print('')
tapis_d(10,10)
