From f7425e0c0c5f43ec35a74d639bb62b63a346b397 Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Sun, 1 Dec 2024 19:09:25 +0100
Subject: [PATCH] update 2024

---
 slides/cours_10.md        |  708 ++++++++++++++++++++++++
 slides/cours_9.md         |  226 +-------
 slides/figs/tri_piles.svg | 1098 +++++++++++++++++++++++++++++++++++++
 3 files changed, 1808 insertions(+), 224 deletions(-)
 create mode 100644 slides/cours_10.md
 create mode 100644 slides/figs/tri_piles.svg

diff --git a/slides/cours_10.md b/slides/cours_10.md
new file mode 100644
index 0000000..d5ddeaa
--- /dev/null
+++ b/slides/cours_10.md
@@ -0,0 +1,708 @@
+---
+title: "Backtracking et piles"
+date: "2024-12-02"
+---
+
+# Le problème des 8-reines
+
+\Huge Le problème des 8-reines
+
+# Problème des 8-reines
+
+* Placer 8 reines sur un échiquier de $8 \times 8$.
+* Sans que les reines ne puissent se menacer mutuellement (92 solutions). 
+
+## Conséquence
+
+* Deux reines ne partagent pas la même rangée, colonne, ou diagonale.
+* Donc chaque solution a **une** reine **par colonne** ou **ligne**.
+
+## Généralisation
+
+* Placer $N$ reines sur un échiquier de $N \times
+  N$. 
+- Exemple de **backtracking** (retour en arrière) $\Rightarrow$ récursivité.
+
+![Problème des 8-reines. Source:
+[wikipedia](https://fr.wikipedia.org/wiki/Problème_des_huit_dames)](./figs/fig_recursivite_8_reines.png){width=35%}
+
+# Problème des 2-reines
+
+![Le problème des 2 reines n'a pas de solution.](figs/2reines.svg){width=50%}
+
+# Comment trouver les solutions?
+
+* On pose la première reine sur la première case disponible.
+* On rend inaccessibles toutes les cases menacées.
+* On pose la reine suivante sur la prochaine case non-menacée.
+* Jusqu'à ce qu'on puisse plus poser de reine.
+* On revient alors en arrière jusqu'au dernier coup où il y avait plus qu'une
+  possibilité de poser une reine.
+* On recommence depuis là.
+
+. . .
+
+* Le jeu prend fin quand on a énuméré *toutes* les possibilités de poser les
+  reines.
+
+# Problème des 3-reines
+
+![Le problème des 3 reines n'a pas de solution non plus.](figs/3reines.svg)
+
+# Problème des 4-reines
+
+![Le problème des 4 reines a une solution.](figs/4reines.svg)
+
+# Problème des 4-reines, symétrie
+
+![Le problème des 4 reines a une autre solution (symétrie
+horizontale).](figs/4reines_sym.svg)
+
+# Problème des 5 reines
+
+## Exercice: Trouver une solution au problème des 5 reines
+
+* Faire une capture d'écran / une photo de votre solution et la poster sur
+  matrix.
+
+```C
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+# Quelques observations sur le problème
+
+* Une reine par colonne au plus.
+* On place les reines sur des colonnes successives.
+* On a pas besoin de "regarder en arrière" (on place "devant" uniquement).
+* Trois étapes:
+    * On place une reine dans une case libre.
+    * On met à jour le tableau.
+    * Quand on a plus de cases libres on "revient dans le temps" ou c'est qu'on
+      a réussi.
+
+# Le code du problème des 8 reines (1/5)
+
+## Quelle structure de données?
+
+. . .
+
+Une matrice de booléens fera l'affaire:
+
+```C
+bool board[n][n];
+```
+
+## Quelles fonctionnalités?
+
+. . .
+
+```C
+// Pour chaque ligne placer la reine sur toutes les colonnes
+//    et compter les solutions
+void nbr_solutions(board, column, counter);
+// Copier un tableau dans un autre
+void copy(board_in, board_out);
+// Placer la reine à li, co et rendre inaccessible devant
+void placer_devant(board, li, co);
+```
+
+# Le code du problème des 8 reines (2/5)
+
+## Le calcul du nombre de solutions
+
+```C
+// Calcule le nombre de solutions au problème des <n> reines
+rien nbr_solutions(board, column, count)
+    pour chaque ligne 
+        si la case libre
+            si column < n - 1
+                copier board dans un "new" board, 
+                    y poser une reine
+                    et mettre à jour ce "new" board
+                nbr_solutions(new_board, column+1, count)
+            sinon
+                on a posé la n-ème et on a gagné
+                count += 1
+```
+
+# Le code du problème des 8 reines (3/5)
+
+## Le calcul du nombre de solutions
+
+```C
+// Placer une reine et mettre à jour
+rien placer_devant(board, ligne, colonne)
+    board est occupé à ligne/colonne
+        toutes les cases des colonnes
+           suivantes sont mises à jour
+```
+
+# Le code du problème des 8 reines (4/5)
+
+## Compris? Alors écrivez le code et postez le!
+
+. . .
+
+## Le nombre de solutions
+
+\footnotesize
+
+```C
+// Calcule le nombre de solutions au problème des <n> reines
+void nb_sol(int n, bool board[n][n], int co, int *ptr_cpt) {
+    for (int li = 0; li < n; li++) {
+        if (board[li][co]) {
+            if (co < n-1) {
+                bool new_board[n][n]; // alloué à chaque nouvelle tentative
+                copy(n, board, new_board);         
+                prises_devant(n, new_board, li, co);
+                nb_sol(n, new_board, co+1, ptr_cpt);
+            } else {
+                *ptr_cpt = (*ptr_cpt)+1;
+            }
+        }
+    }
+}
+```
+
+
+# Le code du problème des 8 reines (5/5)
+
+\footnotesize
+
+## Placer devant
+
+```C
+// Retourne une copie du tableau <board> complété avec les positions
+// prises sur la droite droite par une reine placée en <board(li,co)>
+void placer_devant(int n, bool board[n][n], int li, int co) {
+    board[li][co] = false; // position de la reine
+    for (int j = 1; j < n-co; j++) {
+        // horizontale et diagonales à droite de la reine
+        if (j <= li) {
+            board[li-j][co+j] = false;
+        }
+        board[li][co+j] = false;
+        if (li+j < n) {
+            board[li+j][co+j] = false;
+        }
+    }
+}
+```
+
+# Les piles
+
+\Huge Les piles
+
+# Les piles (1/5)
+
+## Qu'est-ce donc?
+
+* Structure de données abstraite...
+
+. . .
+
+* de type `LIFO` (*Last in first out*).
+
+![Une pile où on ajoute A, puis B avant de les retirer. Source:
+[Wikipedia](https://upload.wikimedia.org/wikipedia/commons/e/e1/Stack_(data_structure)_LIFO.svg)](figs/Stack.svg){width=70%}
+
+## Des exemples de la vraie vie
+
+. . .
+
+* Pile d'assiettes, de livres, ...
+* Adresses visitées par un navigateur web.
+* Les calculatrices du passé (en polonaise inverse).
+* Les boutons *undo* de vos éditeurs de texte (aka *u* dans vim).
+
+# Les piles (2/5)
+
+## Fonctionnalités
+
+. . .
+
+1. Empiler (push): ajouter un élément sur la pile.
+2. Dépiler (pop): retirer l'élément du sommet de la pile et le retourner.
+3. Liste vide? (is_empty?).
+
+. . .
+
+4. Jeter un œil (peek): retourner l'élément du sommet de la pile (sans le dépiler).
+5. Nombre d'éléments (length).
+
+## Comment faire les 4, 5 à partir de 1 à 3?
+
+. . .
+
+4. Dépiler l'élément, le copier, puis l'empiler à nouveau.
+5. Dépiler jusqu'à ce que la pile soit vide, puis empiler à nouveau.
+
+. . .
+
+## Existe en deux goûts
+
+* Pile avec ou sans limite de capacité (à concurrence de la taille de la
+mémoire).
+
+# Les piles (3/5)
+
+## Implémentation
+
+* Jusqu'ici on n'a pas du tout parlé d'implémentation (d'où le nom de structure
+  abstraite).
+* Pas de choix unique d'implémentation.
+
+## Quelle structure de données allons nous utiliser?
+
+. . .
+
+Et oui vous avez deviné: un tableau!
+
+## La structure: de quoi avons-nous besoin (pile de taille fixe)?
+
+. . .
+
+```C
+#define MAX_CAPACITY 500
+typedef struct _stack {
+    int data[MAX_CAPACITY]; // les données
+    int top;                // indice du sommet
+} stack;
+```
+
+# Les piles (4/5)
+
+## Initialisation
+
+. . .
+
+```C
+void stack_init(stack *s) {
+    s->top = -1;
+}
+```
+
+## Est vide?
+
+. . .
+
+```C
+bool stack_is_empty(stack s) {
+    return s.top == -1;
+} 
+```
+
+## Empiler (ajouter un élément au sommet)
+
+. . .
+
+```C
+void stack_push(stack *s, int val) {
+    s->top += 1;
+    s->data[s->top] = val;
+}
+```
+
+# Les piles (5/5)
+
+## Dépiler (enlever l'élément du sommet)
+
+. . .
+
+```C
+int stack_pop(stack *s) {
+    s->top -= 1;
+    return s->data[s->top+1];
+}
+```
+
+## Jeter un oeil (regarder le sommet)
+
+. . .
+
+```C
+int stack_peek(stack s) {
+    return s.data[s.top];
+}
+```
+
+## Quelle est la complexité de ces opérations?
+
+. . .
+
+## Voyez-vous des problèmes potentiels avec cette implémentation?
+
+. . .
+
+* Empiler avec une pile pleine.
+* Dépiler avec une pile vide.
+* Jeter un oeil au sommet d'une pile vide.
+
+# Gestion d'erreur, level 0
+
+* Il y a plusieurs façon de traiter les erreur:
+    * Ne rien faire (laisser la responsabilité à l'utilisateur).
+    * Faire paniquer le programme (il plante plus ou moins violemment).
+    * Utiliser des codes d'erreurs.
+
+## La panique
+
+* En C, on a les `assert()` pour faire paniquer un programme.
+
+# Les assertions
+
+\Huge Les assertions
+
+# Assertions (1/3)
+
+```C
+#include <assert.h>
+void assert(int expression);
+```
+
+## Qu'est-ce donc?
+
+- Macro permettant de tester une condition lors de l'exécution d'un programme:
+  - Si `expression == 0`{.C} (condition fausse), `assert()`{.C} affiche un message d'erreur sur `stderr`{.C} et termine l'exécution du programme.
+  - Sinon l'exécution se poursuit normalement.
+  - Peuvent être désactivés à la compilation avec `-DNDEBUG` (équivalent à `#define NDEBUG`)
+
+## À quoi ça sert?
+
+- Permet de réaliser des tests unitaires.
+- Permet de tester des conditions catastrophiques d'un programme.
+- **Ne permet pas** de gérer les erreurs.
+
+# Assertions (2/3)
+
+<!-- \footnotesize -->
+
+## Exemple
+
+```C
+#include <assert.h>
+void stack_push(stack *s, int val) {
+    assert(s->top < MAX_CAPACITY-1);
+    s->top += 1;
+    s->data[s->top] = val;
+}
+int stack_pop(stack *s) {
+    assert(s->top >= 0);
+    s->top -= 1;
+    return s->data[s->top+1];
+}
+int stack_peek(stack *s) {
+    assert(s->top >= 0);
+    return s->data[s->top];
+}
+```
+
+# Assertions (3/3)
+
+## Cas typiques d'utilisation
+
+- Vérification de la validité des pointeurs (typiquement `!= NULL`{.C}).
+- Vérification du domaine des indices (dépassement de tableau).
+
+## Bug vs. erreur de *runtime*
+
+- Les assertions sont là pour détecter les bugs (erreurs d'implémentation).
+- Les assertions ne sont pas là pour gérer les problèmes externes au programme (allocation mémoire qui échoue, mauvais paramètre d'entrée passé par l'utilisateur, ...).
+
+. . .
+
+- Mais peuvent être pratiques quand même pour ça...
+- Typiquement désactivées dans le code de production.
+
+
+# La pile dynamique
+
+## Comment modifier le code précédent pour avoir une taille dynamique?
+
+. . .
+
+```C
+// alloue une zone mémoire de size octets
+void *malloc(size_t size); 
+// change la taille allouée à size octets (contiguïté garantie)
+void *realloc(void *ptr, size_t size);
+```
+
+. . .
+
+**Attention:** `malloc` sert à allouer un espace mémoire (**pas** de notion de tableau).
+
+## Et maintenant?
+
+. . .
+
+```C
+void stack_create(stack *s); // crée une pile avec une taille par défaut
+// vérifie si la pile est pleine et réalloue si besoin
+void stack_push(stack *s, int val);
+// vérifie si la pile est vide/trop grande 
+// et réalloue si besoin
+void stack_pop(stack *s, int *ret); 
+```
+
+. . .
+
+## Faisons l'implémentation ensemble
+
+# Le tri à deux piles (1/3)
+
+## Cas pratique
+
+![Un exemple de tri à deux piles](figs/tri_piles.svg){width=70%}
+
+# Le tri à deux piles (2/3)
+
+## Exercice: formaliser l'algorithme
+
+. . .
+
+## Algorithme de tri nécessitant 2 piles (G, D)
+
+Soit `tab` le tableau à trier:
+
+```C
+pour i de 0 à N-1
+    tant que (tab[i] > que le sommet de G)
+        dépiler G dans D
+    tant que (tab[i] < que le sommet de D)
+        dépiler de D dans G
+    empiler tab[i] sur G
+dépiler tout D dans G
+tab est trié dans G
+```
+
+# Le tri à deux piles (3/3)
+
+## Exercice: trier le tableau `[2, 10, 5, 20, 15]`
+
+```C
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+# La calculatrice (1/8)
+
+## Vocabulaire
+
+```C
+2 + 3 = 2 3 +,
+```
+
+`2` et `3` sont les *opérandes*, `+` l'*opérateur*.
+
+. . .
+
+## La notation infixe
+
+```C
+2 * (3 + 2) - 4 = 6.
+```
+
+## La notation postfixe
+
+```C
+2 3 2 + * 4 - = 6.
+```
+
+## Exercice: écrire `2 * 3 * 4 + 2` en notation `postfixe`
+
+. . .
+
+```C
+2 3 4 * * 2 + = (2 * (3 * 4)) + 2.
+```
+
+# La calculatrice (2/8)
+
+## De infixe à post-fixe
+
+* Une *pile* est utilisée pour stocker *opérateurs* et *parenthèses*.
+* Les opérateurs on des *priorités* différentes.
+
+```C
+^   : priorité 3
+* / : priorité 2
++ - : priorité 1
+( ) : priorité 0 // pas un opérateur mais bon
+```
+
+
+# La calculatrice (3/8)
+
+## De infixe à post-fixe: algorithme
+
+* On lit l'expression infixe de gauche à droite.
+
+* On examine le prochain caractère de l'expression infixe.
+    * Si opérande, le placer dans l'expression du résultat.
+    * Si parenthèse le mettre dans la pile (priorité 0).
+    * Si opérateur, comparer sa priorité avec celui du sommet de la pile:
+        * Si sa priorité est plus élevée, empiler.
+        * Sinon dépiler l'opérateur de la pile dans l'expression du résultat et
+          recommencer jusqu'à apparition d'un opérateur de priorité plus faible
+          au sommet de la pile (ou pile vide).
+    * Si parenthèse fermée, dépiler les opérateurs du sommet de la pile et les
+      placer dans l'expression du résultat, jusqu'à ce qu'une parenthèse
+      ouverte apparaisse au sommet, dépiler également la parenthèse.
+    * Si il n'y a pas de caractère dans l'expression dépiler tous les
+      opérateurs dans le résultat.
+
+# La calculatrice (4/8)
+
+## De infixe à post-fixe: exemple
+
+```C
+Infixe              Postfixe            Pile    Priorité
+((A*B)/D-F)/(G+H)   Vide                Vide    Néant
+ (A*B)/D-F)/(G+H)   Vide                (       0
+  A*B)/D-F)/(G+H)   Vide                ((      0
+   *B)/D-F)/(G+H)   A                   ((      0
+    B)/D-F)/(G+H)   A                   ((*     2
+     )/D-F)/(G+H)   AB                  ((*     2
+      /D-F)/(G+H)   AB*                 (       0
+       D-F)/(G+H)   AB*                 (/      2
+        -F)/(G+H)   AB*D                (/      2
+         F)/(G+H)   AB*D/               (-      1
+          )/(G+H)   AB*D/F              (-      1
+           /(G+H)   AB*D/F-             Vide    Néant
+```
+
+# La calculatrice (5/8)
+
+## De infixe à post-fixe: exemple
+
+```C
+Infixe              Postfixe            Pile    Priorité
+((A*B)/D-F)/(G+H)   Vide                Vide    Néant
+--------------------------------------------------------
+           /(G+H)   AB*D/F-             Vide    Néant
+            (G+H)   AB*D/F-             /       2
+             G+H)   AB*D/F-             /(      0
+              +H)   AB*D/F-G            /(      0
+               H)   AB*D/F-G            /(+     1
+                )   AB*D/F-GH           /(+     1
+             Vide   AB*D/F-GH+          /       2
+             Vide   AB*D/F-GH+/         Vide    Néant
+```
+
+# La calculatrice (6/8)
+
+\footnotesize
+
+## Exercice: écrire le code et le poster sur matrix
+
+* Quelle est la signature de la fonction?
+
+. . .
+
+* Une sorte de corrigé:
+
+```C
+char *infix_to_postfix(char* infix) { // init and alloc stack and postfix
+    for (size_t i = 0; i < strlen(infix); ++i) {
+        if (is_operand(infix[i])) { 
+            // we just add operands in the new postfix string
+        } else if (infix[i] == '(') { 
+            // we push opening parenthesis into the stack
+        } else if (infix[i] == ')') { 
+            // we pop everything into the postfix
+        } else if (is_operator(infix[i])) {
+            // this is an operator. We add it to the postfix based 
+            // on the priority of what is already in the stack and push it
+        }    
+    } 
+    // pop all the operators from the s at the end of postfix
+    // and end the postfix with `\0`
+    return postfix;
+} 
+```
+
+
+# La calculatrice (7/8)
+
+## Évaluation d'expression postfixe: algorithme
+
+* Chaque *opérateur* porte sur les deux opérandes qui le précèdent.
+* Le *résultat d'une opération* est un nouvel *opérande* qui est remis au
+  sommet de la pile.
+
+## Exemple
+
+```C
+2 3 4 + * 5 - = ?
+```
+
+* On parcours de gauche à droite:
+
+```C
+Caractère lu        Pile opérandes
+    2               2
+    3               2, 3
+    4               2, 3, 4
+    +               2, (3 + 4)
+    *               2 * 7
+    5               14, 5
+    -               14 - 5 = 9
+```
+
+# La calculatrice (8/8)
+
+## Évaluation d'expression postfixe: algorithme
+
+1. La valeur d'un opérande est *toujours* empilée.
+2. L'opérateur s'applique *toujours* au 2 opérandes au sommet.
+3. Le résultat est remis au sommet.
+
+## Exercice: écrire l'algorithme en C (et poster sur matrix)
+
+. . .
+
+```C
+bool evaluate(char *postfix, double *val) { // init stack
+    for (size_t i = 0; i < strlen(postfix); ++i) {
+        if (is_operand(postfix[i])) {
+            stack_push(&s, postfix[i]);
+        } else if (is_operator(postfix[i])) {
+            double rhs = stack_pop(&s);
+            double lhs = stack_pop(&s);
+            stack_push(&s, op(postfix[i], lhs, rhs));
+        }    
+    }
+    return stack_pop(&s);
+}
+```
+
+
+
diff --git a/slides/cours_9.md b/slides/cours_9.md
index 71d4667..f2b376f 100644
--- a/slides/cours_9.md
+++ b/slides/cours_9.md
@@ -7,6 +7,8 @@ header-includes: |
 
 # Le tri à bulle
 
+\Huge Le tri à bulle
+
 # Tri à bulle (1/4)
 
 ## Algorithme
@@ -499,227 +501,3 @@ void placer_devant(int n, bool board[n][n], int li, int co) {
 }
 ```
 
-# Les piles
-
-\Huge Les piles
-
-# Les piles (1/5)
-
-## Qu'est-ce donc?
-
-* Structure de données abstraite...
-
-. . .
-
-* de type `LIFO` (*Last in first out*).
-
-![Une pile où on ajoute A, puis B avant de les retirer. Source:
-[Wikipedia](https://upload.wikimedia.org/wikipedia/commons/e/e1/Stack_(data_structure)_LIFO.svg)](figs/Stack.svg){width=70%}
-
-## Des exemples de la vraie vie
-
-. . .
-
-* Pile d'assiettes, de livres, ...
-* Adresses visitées par un navigateur web.
-* Les calculatrices du passé (en polonaise inverse).
-* Les boutons *undo* de vos éditeurs de texte (aka *u* dans vim).
-
-# Les piles (2/5)
-
-## Fonctionnalités
-
-. . .
-
-1. Empiler (push): ajouter un élément sur la pile.
-2. Dépiler (pop): retirer l'élément du sommet de la pile et le retourner.
-3. Liste vide? (is_empty?).
-
-. . .
-
-4. Jeter un œil (peek): retourner l'élément du sommet de la pile (sans le dépiler).
-5. Nombre d'éléments (length).
-
-## Comment faire les 4, 5 à partir de 1 à 3?
-
-. . .
-
-4. Dépiler l'élément, le copier, puis l'empiler à nouveau.
-5. Dépiler jusqu'à ce que la pile soit vide, puis empiler à nouveau.
-
-. . .
-
-## Existe en deux goûts
-
-* Pile avec ou sans limite de capacité (à concurrence de la taille de la
-mémoire).
-
-# Les piles (3/5)
-
-## Implémentation
-
-* Jusqu'ici on n'a pas du tout parlé d'implémentation (d'où le nom de structure
-  abstraite).
-* Pas de choix unique d'implémentation.
-
-## Quelle structure de données allons nous utiliser?
-
-. . .
-
-Et oui vous avez deviné: un tableau!
-
-## La structure: de quoi avons-nous besoin (pile de taille fixe)?
-
-. . .
-
-```C
-#define MAX_CAPACITY 500
-typedef struct _stack {
-    int data[MAX_CAPACITY]; // les données
-    int top;                // indice du sommet
-} stack;
-```
-
-# Les piles (4/5)
-
-## Initialisation
-
-. . .
-
-```C
-void stack_init(stack *s) {
-    s->top = -1;
-}
-```
-
-## Est vide?
-
-. . .
-
-```C
-bool stack_is_empty(stack s) {
-    return s.top == -1;
-} 
-```
-
-## Empiler (ajouter un élément au sommet)
-
-. . .
-
-```C
-void stack_push(stack *s, int val) {
-    s->top += 1;
-    s->data[s->top] = val;
-}
-```
-
-# Les piles (5/5)
-
-## Dépiler (enlever l'élément du sommet)
-
-. . .
-
-```C
-int stack_pop(stack *s) {
-    s->top -= 1;
-    return s->data[s->top+1];
-}
-```
-
-## Jeter un oeil (regarder le sommet)
-
-. . .
-
-```C
-int stack_peek(stack s) {
-    return s.data[s.top];
-}
-```
-
-## Quelle est la complexité de ces opérations?
-
-. . .
-
-## Voyez-vous des problèmes potentiels avec cette implémentation?
-
-. . .
-
-* Empiler avec une pile pleine.
-* Dépiler avec une pile vide.
-* Jeter un oeil au sommet d'une pile vide.
-
-# Gestion d'erreur, level 0
-
-* Il y a plusieurs façon de traiter les erreur:
-    * Ne rien faire (laisser la responsabilité à l'utilisateur).
-    * Faire paniquer le programme (il plante plus ou moins violemment).
-    * Utiliser des codes d'erreurs.
-
-## La panique
-
-* En C, on a les `assert()` pour faire paniquer un programme.
-
-# Les assertions
-
-\Huge Les assertions
-
-# Assertions (1/3)
-
-```C
-#include <assert.h>
-void assert(int expression);
-```
-
-## Qu'est-ce donc?
-
-- Macro permettant de tester une condition lors de l'exécution d'un programme:
-  - Si `expression == 0`{.C} (condition fausse), `assert()`{.C} affiche un message d'erreur sur `stderr`{.C} et termine l'exécution du programme.
-  - Sinon l'exécution se poursuit normalement.
-  - Peuvent être désactivés à la compilation avec `-DNDEBUG` (équivalent à `#define NDEBUG`)
-
-## À quoi ça sert?
-
-- Permet de réaliser des tests unitaires.
-- Permet de tester des conditions catastrophiques d'un programme.
-- **Ne permet pas** de gérer les erreurs.
-
-# Assertions (2/3)
-
-<!-- \footnotesize -->
-
-## Exemple
-
-```C
-#include <assert.h>
-void stack_push(stack *s, int val) {
-    assert(s->top < MAX_CAPACITY-1);
-    s->top += 1;
-    s->data[s->top] = val;
-}
-int stack_pop(stack *s) {
-    assert(s->top >= 0);
-    s->top -= 1;
-    return s->data[s->top+1];
-}
-int stack_peek(stack *s) {
-    assert(s->top >= 0);
-    return s->data[s->top];
-}
-```
-
-# Assertions (3/3)
-
-## Cas typiques d'utilisation
-
-- Vérification de la validité des pointeurs (typiquement `!= NULL`{.C}).
-- Vérification du domaine des indices (dépassement de tableau).
-
-## Bug vs. erreur de *runtime*
-
-- Les assertions sont là pour détecter les bugs (erreurs d'implémentation).
-- Les assertions ne sont pas là pour gérer les problèmes externes au programme (allocation mémoire qui échoue, mauvais paramètre d'entrée passé par l'utilisateur, ...).
-
-. . .
-
-- Mais peuvent être pratiques quand même pour ça...
-- Typiquement désactivées dans le code de production.
diff --git a/slides/figs/tri_piles.svg b/slides/figs/tri_piles.svg
new file mode 100644
index 0000000..bed1916
--- /dev/null
+++ b/slides/figs/tri_piles.svg
@@ -0,0 +1,1098 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="400.30954mm"
+   height="338.27808mm"
+   viewBox="0 0 400.30953 338.27808"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.1.1 (3bf5ae0, 2021-09-20)"
+   sodipodi:docname="tri_piles.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:object-nodes="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:zoom="0.17983246"
+     inkscape:cx="372.569"
+     inkscape:cy="316.96169"
+     inkscape:window-width="944"
+     inkscape:window-height="1022"
+     inkscape:window-x="962"
+     inkscape:window-y="44"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid1021"
+       originx="62.88159"
+       originy="-54.378437" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(62.881592,-54.378433)">
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="31.093731"
+       y="195.68054"
+       id="text9123"><tspan
+         sodipodi:role="line"
+         id="tspan9121"
+         style="stroke-width:0.264583"
+         x="31.093731"
+         y="195.68054">17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="143.56741"
+       y="195.67538"
+       id="text9123-38-6"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-1"
+         style="stroke-width:0.264583"
+         x="143.56741"
+         y="195.67538">34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="255.97629"
+       y="195.67538"
+       id="text9123-38-1"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-5"
+         style="stroke-width:0.264583"
+         x="255.97629"
+         y="195.67538">34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="86.707741"
+       y="331.52029"
+       id="text9123-38-9"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-8"
+         style="stroke-width:0.264583"
+         x="86.707741"
+         y="331.52029">34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="143.56741"
+       y="352.64828"
+       id="text9123-38-4"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-81"
+         style="stroke-width:0.264583"
+         x="143.56741"
+         y="352.64828">34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="255.97629"
+       y="352.64828"
+       id="text9123-38-0"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-3"
+         style="stroke-width:0.264583"
+         x="255.97629"
+         y="352.64828">34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="198.97969"
+       y="195.68054"
+       id="text9123-2"><tspan
+         sodipodi:role="line"
+         id="tspan9121-9"
+         style="stroke-width:0.264583"
+         x="198.97969"
+         y="195.68054">17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="311.38858"
+       y="195.68054"
+       id="text9123-3"><tspan
+         sodipodi:role="line"
+         id="tspan9121-90"
+         style="stroke-width:0.264583"
+         x="311.38858"
+         y="195.68054">17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="86.570801"
+       y="373.73682"
+       id="text9123-8"><tspan
+         sodipodi:role="line"
+         id="tspan9121-8"
+         style="stroke-width:0.264583"
+         x="86.570801"
+         y="373.73682">17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="198.97969"
+       y="373.73682"
+       id="text9123-5"><tspan
+         sodipodi:role="line"
+         id="tspan9121-0"
+         style="stroke-width:0.264583"
+         x="198.97969"
+         y="373.73682">17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="255.83934"
+       y="289.21954"
+       id="text9123-9"><tspan
+         sodipodi:role="line"
+         id="tspan9121-6"
+         style="stroke-width:0.264583"
+         x="255.83934"
+         y="289.21954">17</tspan></text>
+    <g
+       id="g11117">
+      <g
+         id="g10399">
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="181.23958" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-3"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="160.15623" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-6"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="139.02823" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-3-7"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="117.94488" />
+        <g
+           id="g10389">
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-3-5"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="96.722282" />
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-6-3"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="75.594284" />
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-3-7-5"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="54.510933" />
+        </g>
+      </g>
+      <g
+         id="g10399-6"
+         transform="translate(55.549231)">
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-2"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="181.23958" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-3-9"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="160.15623" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-6-1"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="139.02823" />
+        <rect
+           style="fill:none;stroke:#000000;stroke-width:0.264999"
+           id="rect7953-3-7-2"
+           width="38.364582"
+           height="21.166666"
+           x="18.448671"
+           y="117.94488" />
+        <g
+           id="g10389-7">
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-3-5-0"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="96.722282" />
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-6-3-9"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="75.594284" />
+          <rect
+             style="fill:none;stroke:#000000;stroke-width:0.264999"
+             id="rect7953-3-7-5-3"
+             width="38.364582"
+             height="21.166666"
+             x="18.448671"
+             y="54.510933" />
+        </g>
+      </g>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="M 18.520833,202.40625 H 112.44792"
+         id="path11016" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-62"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="181.23958" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-6"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="160.15623" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-18"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="139.02823" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-7"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="117.94488" />
+    <g
+       id="g10389-9"
+       transform="translate(112.4089)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-2"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-0"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-2"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-2-7"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="181.23958" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-9-5"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="160.15623" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-1-9"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="139.02823" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-2-2"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="117.94488" />
+    <g
+       id="g10389-7-2"
+       transform="translate(167.95813)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-0-8"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-9-9"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-3-7"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 130.92973,202.40625 h 93.92709"
+       id="path11016-3" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-9"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="181.23958" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-3"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="160.15623" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-19"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="139.02823" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-4"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="117.94488" />
+    <g
+       id="g10389-78"
+       transform="translate(224.81778)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-4"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-5"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-0"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-2-1"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="181.23958" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-9-0"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="160.15623" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-1-6"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="139.02823" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-2-3"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="117.94488" />
+    <g
+       id="g10389-7-20"
+       transform="translate(280.36701)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-0-6"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-9-1"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-3-5"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 243.33861,202.40625 H 337.2657"
+       id="path11016-5" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-37"
+       width="38.364582"
+       height="21.166666"
+       x="18.448673"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-4"
+       width="38.364582"
+       height="21.166666"
+       x="18.448673"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-5"
+       width="38.364582"
+       height="21.166666"
+       x="18.448673"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-25"
+       width="38.364582"
+       height="21.166666"
+       x="18.448673"
+       y="296.00116" />
+    <g
+       id="g10389-4"
+       transform="translate(2e-6,178.05627)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-7"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-4"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-4"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-2-78"
+       width="38.364582"
+       height="21.166666"
+       x="73.997902"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-9-6"
+       width="38.364582"
+       height="21.166666"
+       x="73.997902"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-1-8"
+       width="38.364582"
+       height="21.166666"
+       x="73.997902"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-2-8"
+       width="38.364582"
+       height="21.166666"
+       x="73.997902"
+       y="296.00116" />
+    <g
+       id="g10389-7-4"
+       transform="translate(55.549233,178.05627)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-0-3"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-9-14"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-3-9"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 18.520835,380.46252 H 112.44792"
+       id="path11016-2" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-62-8"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-6-9"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-18-2"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-7-6"
+       width="38.364582"
+       height="21.166666"
+       x="130.85757"
+       y="296.00116" />
+    <g
+       id="g10389-9-6"
+       transform="translate(112.4089,178.05627)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-2-4"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-0-9"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-2-5"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-2-7-4"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-9-5-8"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-1-9-7"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-2-2-1"
+       width="38.364582"
+       height="21.166666"
+       x="186.4068"
+       y="296.00116" />
+    <g
+       id="g10389-7-2-7"
+       transform="translate(167.95813,178.05627)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-0-8-2"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-9-9-7"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-3-7-2"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 130.92973,380.46252 h 93.92709"
+       id="path11016-3-2" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-9-0"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-3-6"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-19-1"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-4-5"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="296.00116" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-5-4-4"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="274.77856" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-3-5-9"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="253.65056" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-5-0-0"
+       width="38.364582"
+       height="21.166666"
+       x="243.26645"
+       y="232.5672" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-2-1-1"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="359.29584" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-9-0-7"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="338.21249" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-6-1-6-7"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="317.0845" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.264999"
+       id="rect7953-3-7-2-3-1"
+       width="38.364582"
+       height="21.166666"
+       x="298.81567"
+       y="296.00116" />
+    <g
+       id="g10389-7-20-1"
+       transform="translate(280.36701,178.05627)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-0-6-5"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="96.722282" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-9-1-9"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="75.594284" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-3-5-7"
+         width="38.364582"
+         height="21.166666"
+         x="18.448671"
+         y="54.510933" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 243.33861,380.46252 H 337.2657"
+       id="path11016-5-7" />
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="17.667999"
+       y="216.45665"
+       id="text17742"><tspan
+         sodipodi:role="line"
+         id="tspan17740"
+         style="stroke-width:0.248075"
+         x="17.667999"
+         y="216.45665">traitement de 17</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="242.48578"
+       y="216.45665"
+       id="text17742-6"><tspan
+         sodipodi:role="line"
+         id="tspan17740-7"
+         style="stroke-width:0.248075"
+         x="242.48578"
+         y="216.45665">traitement de 20</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="260.53665"
+       y="392.51599"
+       id="text17742-3"><tspan
+         sodipodi:role="line"
+         id="tspan17740-6"
+         style="stroke-width:0.248075"
+         x="260.53665"
+         y="392.51599">état final</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="130.0769"
+       y="392.51599"
+       id="text17742-5"><tspan
+         sodipodi:role="line"
+         id="tspan17740-63"
+         style="stroke-width:0.248075"
+         x="130.0769"
+         y="392.51599">traitement de 25</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="130.0769"
+       y="216.45665"
+       id="text17742-9"><tspan
+         sodipodi:role="line"
+         id="tspan17740-4"
+         style="stroke-width:0.248075"
+         x="130.0769"
+         y="216.45665">traitement de 34</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.92302px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.248075"
+       x="17.668001"
+       y="392.51599"
+       id="text17742-8"><tspan
+         sodipodi:role="line"
+         id="tspan17740-1"
+         style="stroke-width:0.248075"
+         x="17.668001"
+         y="392.51599">traitement de 40</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="256.02795"
+       y="174.59204"
+       id="text9123-38"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5"
+         style="stroke-width:0.264583"
+         x="256.02795"
+         y="174.59204">20</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="86.759415"
+       y="352.64828"
+       id="text9123-38-04"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-4"
+         style="stroke-width:0.264583"
+         x="86.759415"
+         y="352.64828">20</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="199.16832"
+       y="352.64828"
+       id="text9123-38-44"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-7"
+         style="stroke-width:0.264583"
+         x="199.16832"
+         y="352.64828">20</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="256.02795"
+       y="310.43695"
+       id="text9123-38-63"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-17"
+         style="stroke-width:0.264583"
+         x="256.02795"
+         y="310.43695">20</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="31.339378"
+       y="373.73163"
+       id="text9123-38-5"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-9"
+         style="stroke-width:0.264583"
+         x="31.339378"
+         y="373.73163">40</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="143.74828"
+       y="373.73163"
+       id="text9123-38-5-6"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-9-2"
+         style="stroke-width:0.264583"
+         x="143.74828"
+         y="373.73163">40</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="256.15717"
+       y="373.73163"
+       id="text9123-38-5-1"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-9-7"
+         style="stroke-width:0.264583"
+         x="256.15717"
+         y="373.73163">40</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="143.69919"
+       y="331.52029"
+       id="text9123-38-5-8"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-9-5"
+         style="stroke-width:0.264583"
+         x="143.69919"
+         y="331.52029">25</tspan></text>
+    <g
+       id="g41345"
+       transform="translate(0,-0.68789673)">
+      <text
+         xml:space="preserve"
+         style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+         x="-50.176193"
+         y="196.36844"
+         id="text9123-88"><tspan
+           sodipodi:role="line"
+           id="tspan9121-3"
+           style="stroke-width:0.264583"
+           x="-50.176193"
+           y="196.36844">17</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+         x="-50.039249"
+         y="175.27994"
+         id="text9123-38-6-1"><tspan
+           sodipodi:role="line"
+           id="tspan9121-5-1-8"
+           style="stroke-width:0.264583"
+           x="-50.039249"
+           y="175.27994">34</tspan></text>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-18-1"
+         width="38.364582"
+         height="21.166666"
+         x="-62.749088"
+         y="181.92747" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-7-8"
+         width="38.364582"
+         height="21.166666"
+         x="-62.749088"
+         y="160.84413" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-5-2-9"
+         width="38.364582"
+         height="21.166666"
+         x="-62.749092"
+         y="139.62154" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-6-3-0-7"
+         width="38.364582"
+         height="21.166666"
+         x="-62.749092"
+         y="118.49354" />
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.264999"
+         id="rect7953-3-7-5-2-53"
+         width="38.364582"
+         height="21.166666"
+         x="-62.749092"
+         y="97.410187" />
+      <text
+         xml:space="preserve"
+         style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+         x="-49.987576"
+         y="154.05734"
+         id="text9123-38-96"><tspan
+           sodipodi:role="line"
+           id="tspan9121-5-43"
+           style="stroke-width:0.264583"
+           x="-49.987576"
+           y="154.05734">20</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+         x="-49.858387"
+         y="132.92934"
+         id="text9123-38-5-3"><tspan
+           sodipodi:role="line"
+           id="tspan9121-5-9-3"
+           style="stroke-width:0.264583"
+           x="-49.858387"
+           y="132.92934">40</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+         x="-49.907478"
+         y="111.84599"
+         id="text9123-38-5-8-8"><tspan
+           sodipodi:role="line"
+           id="tspan9121-5-9-5-6"
+           style="stroke-width:0.264583"
+           x="-49.907478"
+           y="111.84599">25</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:10.5833px;line-height:1.25;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
+       x="256.10806"
+       y="331.52029"
+       id="text9123-38-5-8-7"><tspan
+         sodipodi:role="line"
+         id="tspan9121-5-9-5-4"
+         style="stroke-width:0.264583"
+         x="256.10806"
+         y="331.52029">25</tspan></text>
+  </g>
+</svg>
-- 
GitLab