Somme maximale dans une grille

On considère dans cet exercice des grilles non vides contenant des entiers positifs ou nuls telles que celle représentée ci-dessous :

\[ \begin{array}{|c|c|c|c|} \hline 3&5&6\\ \hline 4&9&1\\ \hline \end{array} \]

On cherche à déterminer la somme maximale obtenue en parcourant la grille :

  • depuis la case en haut à gauche (case d'origine)
  • jusqu'à la case en bas à droite (case finale)
  • en ne faisant que des déplacements vers la droite ➡ ou vers le bas ⬇.

Dans l'exemple ci-dessus, la somme maximale vaut \(18\). Elle est obtenue en faisant le parcours \(3\) ➡ \(5\) ⬇ \(9\) ➡ \(1\).

Ces grilles sont représentées en machine par des listes de listes Python. La grille précédente est ainsi représentée par :

🐍 Script Python
grille = [
    [3, 5, 6],
    [4, 9, 1]
]

La valeur de la case finale s'obtient en faisant grille[1][2]. On dit que cette case a pour coordonnées (1, 2).

On demande donc d'écrire la fonction somme_maximale qui prend en paramètre la liste de listes grille et renvoie la somme maximale que l'on peut obtenir en effectuant le parcours.

L'idée principale est de compléter un tableau maxis de mêmes dimensions que la grille et contenant, dans chaque cellule de coordonnées (i, j), la somme maximale des chemins partant de l'origine et allant jusqu'à la cellule de coordonnées (i, j).

Dans l'exemple précédent, ce tableau est :

🐍 Script Python
maxis = [
    [3,  8, 14],
    [7, 17, 18]
]

On constate que le chemin maximal entre l'origine et la case de coordonnées (0, 2) a pour valeur 14. Il s'agit du chemin 3 ➡ 5 ➡ 6.

On propose trois versions de cette fonction :

  • une version récursive utilisant la mémoïsation et complétant le tableau maxis récursivement depuis la case finale,
  • une version itérative complétant le tableau maxis depuis la case d'origine,
  • une seconde version itérative optimisant l'espace mémoire.

Dans le cas général où la case étudiée n'est ni sur la première ligne, ni sur la première colonne, il est intéressant de remarquer qu'il n'y a que deux manières d'arriver à cette position : en venant soit de la case du dessus soit de celle de gauche. Le chemin le plus intéressant est celui qui est associé à la somme la plus importante.

Version récursive

Dans cette version on utilise une fonction annexe somme_maximale_rec qui prend en paramètres les coordonnées i et j d'une case, calcule et renvoie la valeur de maxis[i][j] (c'est à dire la somme maximale que l'on peut obtenir en allant de l'origine à la case (i, j)).

Le tableau maxis est initialisé dans la fonction principale somme_maximale. On pourra le compléter initialement avec la valeur None afin de facilement distinguer les cellules déjà calculées de celles restant à calculer.

Cette version remonte les chemins depuis la case finale (en bas à droite) jusqu'à la case d'origine. Chaque pas « en arrière » correspond à un appel récursif.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+Njtwki9][5hx)6050i0B0M0u0P0p0b0r0h0p0u0b0b0G010M0P0v010406050b0j0A0A0u0x0q040w0d0p0j0=0d0s050n0|0~10120`0v041b1i051l0n1l1n1i0`0i0P0l0*0,0.0:0U0P0m0U0p1B0U0M0^050#0g0p0B1w0-0/011A1C1E1C0M1K1M1I0M0g0d0i121J0x1j0M0U0*150b0v0u0s0:0F011O1y010k0%0B0s0u0A0B1I1:1=1`1Q1}1M20220^0a0r0E0x0d0v0d0b0P180s0r0Z1.0x0x0B0h2n1b250s1j0n1,2A0M1*1)1+0i270:1E0s1 2k1I1t1v0+1P2K0P2M0s1$1u1I0v2t1j2y2A2(0{1;2o2S1{2X0x0 0p0^0r0y2x2,0_2+262.1Q2:2=2@0F2`1=2|2y2J01310u2?040r0c352z0`382 0:3b3d0r0H3h372,393n2@0T3r3j3t3l3a0d2;3c2@0X3y2}2-1x303D323e0t3I3k3L3m3N3F3e0f3R3A3T3C3E3o0Q3Z2~3#3v040y0o3*3K2T3$3O0y2_1c2{3z3+3?3-0y343{363}3=2/3V3d0y3g433i3J3u480^0y3q4c3s3~473%4h3x4k454f4o3.3H4r4e3B403Q4x3S3 4g3.3Y4k1k2$1b2Q2D0i2H390h1$231j4M1m4K2*4I4R0Z2%3!3?0O0^0Z0k3r4y3#0N2@4-4D2/0k0^0b0d0~0B0e0 0V0P2=0B4=4%1{0@040D544m300^0m0x0%1M5a461Q570W0I3y0r5p0r4.4(4*0B4,4I4?1Q4:3e5i3u4^044`4|4~0u50520e2t0h5C3B57595x555c040P5P3#570C3r5r5y3m0^0L5Y3?5l5n4r5q5;5%5U0:4)5W5w2(5?5b5)044 0P0b5,560^0S645V5X5T5~01570R676b5j5 5+6h396e5$5s1{0d5A626o5(010O0h0^0K19536l5Q0^5/2(065=6J5}6i6w0^0P5{2{6L3u6O6u5@010d0^0G0G6V6c0A0P0^3:6D5Z6F5o6K6:6p5V61636,5-66685 6a2*6v6e6g6 6W0s5*6|6d0^0R6$6M6Y046#4k6S4z5d5f0p5h6_6504722{6=6}77717775046k736c6n7g7s6X0^0J7b6T5F4{225I5K3c4}5N7u0^5S7A6M7x6~7r700^5#7D6v7x7z6R7E7d0z7I3B6(4h7S040W6/6:5p7E5_0B1E6Q367h3,767%6W7d6!7/3#7;046+7V6m6.5:7`6J7E7x6@7?7q368k6U7n5k798o2z8q7y7?7a856c87893 7j5g6C8e6E7p7w8r8J6-046f8M8y8s0:7C5|7,7G8E2/4_7L4}615L7R8U78588S7Y818Y047.8B6M8b3`8O6`047$8X7(848|7o7^8h8i7|0^7~0b8I7Z6W576G3|8i8j91605J6t8,578v4$6c7X8z9q8x7*8p7!8Q8!1Q8D8^7J5e8H8n8/9u8S9x8w9z8A90868Z9E4z0g0^4 7?7U9h9i6;9k5G7M8)7P5M2u9Y9J9T3#7-9B0:8`7?8 7+9k9M9r6M5l9`8;9%8%7N519+8+938t8.8,9t9o7#9?3a929{9R8?ag9^ae7@7_9#828}956H9$6W5_2t0M0j0x1a9:8F9l506^a98V6{ac8N9d7B8u9L8z3y6I5q8x0U0u170BaBag9D9Q9s9V042a9.aM049G7l9c9y9e0^au9!7{9k0,0x0ma!0xa$6Zag0sa*a,ao9Za?9s8Ga;9I8,8b8daO9 79a_445;8x8maE6qb3bqaa0S9v6v6x6z6Bag5_0k3Db40^0ea$6saDa(7Wa*0x1=a a-aJaha+10a a#ao0W9Paj6cbCbEbt5 bHb)6XbJb4bNbPa=9Na@abbS7xaXaZbXbS5lb!bmaV9kbpb~aLbSbg9Kbf6)8caSb,a%b#7Wbc7mc58Lca6*c9c7cbbhbabj9A96as1{ay0!aBbKcg7J9(8(9m8*9-b88Sb{0Mb0b2alb,ancka12zcw5Va}bWb1ce0^8@bL39cRbi8fap4x0n4!0B2A2#c:4L1u4N2D2F2B1#1%2D0u1Lc?0n4M0`d30!0$0(04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+Njtwki9][5hx)6050i0B0M0u0P0p0b0r0h0p0u0b0b0G010M0P0v010406050b0j0A0A0u0x0q040w0d0p0j0=0d0s050n0|0~10120`0v041b1i051l0n1l1n1i0`0i0P0l0*0,0.0:0U0P0m0U0p1B0U0M0^050#0g0p0B1w0-0/011A1C1E1C0M1K1M1I0M0g0d0i121J0x1j0M0U0*150b0v0u0s0:0F011O1y010k0%0B0s0u0A0B1I1:1=1`1Q1}1M20220^0a0r0E0x0d0v0d0b0P180s0r0Z1.0x0x0B0h2n1b250s1j0n1,2A0M1*1)1+0i270:1E0s1 2k1I1t1v0+1P2K0P2M0s1$1u1I0v2t1j2y2A2(0{1;2o2S1{2X0x0 0p0^0r0y2x2,0_2+262.1Q2:2=2@0F2`1=2|2y2J01310u2?040r0c352z0`382 0:3b3d0r0H3h372,393n2@0T3r3j3t3l3a0d2;3c2@0X3y2}2-1x303D323e0t3I3k3L3m3N3F3e0f3R3A3T3C3E3o0Q3Z2~3#3v040y0o3*3K2T3$3O0y2_1c2{3z3+3?3-0y343{363}3=2/3V3d0y3g433i3J3u480^0y3q4c3s3~473%4h3x4k454f4o3.3H4r4e3B403Q4x3S3 4g3.3Y4k1k2$1b2Q2D0i2H390h1$231j4M1m4K2*4I4R0Z2%3!3?0O0^0Z0k3r4y3#0N2@4-4D2/0k0^0b0d0~0B0e0 0V0P2=0B4=4%1{0@040D544m300^0m0x0%1M5a461Q570W0I3y0r5p0r4.4(4*0B4,4I4?1Q4:3e5i3u4^044`4|4~0u50520e2t0h5C3B57595x555c040P5P3#570C3r5r5y3m0^0L5Y3?5l5n4r5q5;5%5U0:4)5W5w2(5?5b5)044 0P0b5,560^0S645V5X5T5~01570R676b5j5 5+6h396e5$5s1{0d5A626o5(010O0h0^0K19536l5Q0^5/2(065=6J5}6i6w0^0P5{2{6L3u6O6u5@010d0^0G0G6V6c0A0P0^3:6D5Z6F5o6K6:6p5V61636,5-66685 6a2*6v6e6g6 6W0s5*6|6d0^0R6$6M6Y046#4k6S4z5d5f0p5h6_6504722{6=6}77717775046k736c6n7g7s6X0^0J7b6T5F4{225I5K3c4}5N7u0^5S7A6M7x6~7r700^5#7D6v7x7z6R7E7d0z7I3B6(4h7S040W6/6:5p7E5_0B1E6Q367h3,767%6W7d6!7/3#7;046+7V6m6.5:7`6J7E7x6@7?7q368k6U7n5k798o2z8q7y7?7a856c87893 7j5g6C8e6E7p7w8r8J6-046f8M8y8s0:7C5|7,7G8E2/4_7L4}615L7R8U78588S7Y818Y047.8B6M8b3`8O6`047$8X7(848|7o7^8h8i7|0^7~0b8I7Z6W576G3|8i8j91605J6t8,578v4$6c7X8z9q8x7*8p7!8Q8!1Q8D8^7J5e8H8n8/9u8S9x8w9z8A90868Z9E4z0g0^4 7?7U9h9i6;9k5G7M8)7P5M2u9Y9J9T3#7-9B0:8`7?8 7+9k9M9r6M5l9`8;9%8%7N519+8+938t8.8,9t9o7#9?3a929{9R8?ag9^ae7@7_9#828}956H9$6W5_2t0M0j0x1a9:8F9l506^a98V6{ac8N9d7B8u9L8z3y6I5q8x0U0u170BaBag9D9Q9s9V042a9.aM049G7l9c9y9e0^au9!7{9k0,0x0ma!0xa$6Zag0sa*a,ao9Za?9s8Ga;9I8,8b8daO9 79a_445;8x8maE6qb3bqaa0S9v6v6x6z6Bag5_0k3Db40^0ea$6saDa(7Wa*0x1=a a-aJaha+10a a#ao0W9Paj6cbCbEbt5 bHb)6XbJb4bNbPa=9Na@abbS7xaXaZbXbS5lb!bmaV9kbpb~aLbSbg9Kbf6)8caSb,a%b#7Wbc7mc58Lca6*c9c7cbbhbabj9A96as1{ay0!aBbKcg7J9(8(9m8*9-b88Sb{0Mb0b2alb,ancka12zcw5Va}bWb1ce0^8@bL39cRbi8fap4x0n4!0B2A2#c:4L1u4N2D2F2B1#1%2D0u1Lc?0n4M0`d30!0$0(04.
Version itérative (1)

On cherche toujours à compléter le tableau maxis mais cette fois-ci on part de l'origine de la grille et on progresse, colonne par colonne et ligne par ligne jusqu'à atteindre la case finale.

Le tableau maxis est initialisé aux bonnes dimensions en ne contenant que des valeurs nulles.

La première ligne et la première colonne de cette liste sont traitées à part.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+jtwki9][5hx)6050i0B0L0u0O0p0b0r0h0p0u0b0b0G010L0O0v010406050b0j0A0A0u0x0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0O0l0)0+0-0/0T0O0m0T0p1A0T0L0@050!0g0p0B1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0x1i0L0T0)140b0v0u0s0/0F011N1x010k0$0B0s0u0A0B1H1/1;1_1P1|1L1 210@0a0r0E0x0d0v0d0b0O170s0r0Y1-0x0x0B0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0O2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0x0~0p0@0r0y2w2+0^2*252-1P2/2;2?0F2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0H3g362+383m2?0S3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0P3Y2}3!3u040y0o3)3J2S3#3N0y2^1b2`3y3*3=3,0y333`353|3;2.3U3c0y3f422y1j2#1a2P2C0i2G380h1#221i4g1l4e2)4b1i4l0Y2$3Z3=0N0@0Y0k3q3I380M2?4E3R3~0k0@0b0d0}0B0e0~0U0O2;0B4J4y1`0?040D4Y3}2.0@0m0x0$1L4(451P4#0V0I3x0r4`0r4F3A0s0@0T0u160B0j0x3q4|4K1`0d0@0G574}3+0g0@294:384#4%4t5f3~4+4-0p4/5o594=0@0V4_4{5p4*040+0x0m54564t584Z1P5b045d5K5C2 5h5E1~5k3A5m5X3+5r4.4X5v5M0/4#0R5!3=0A0O0@3/5)4)5x040Q5z4t064{5L5^3l0@4T0O0b5e5w0/5O5Q2%604;5+0@0R5-5@6e015:5=675*014A040k3C6o61390@0e6v6k0d4H042U6A3t5U0x1;5H5.4!0@5n2)686x5E0 5H556M5_0V0Q6G3A6r6t5J6c5S62046z5R6R6C0@6F6/6p0s6I6K5(6Q6p5Z6j3t50520L5I6X6f046Z5A4`6+6S6466705Y6g766l5;045?6}6w4#0Q6i7o6k6m7m7j7q6#3!6a7z5q044,5%7x7i7g3!7v7n2`7c7q7s7N6R7L7H5`7a6d386%6u6@6w4 6E7C5a6D6?6*6R6_0@6J0s6L7J3=6 7t387v3_7`7h040C7)2 72536W7@6N784^5}5 5 7c7%7e7U7Q358e6=7U7r7j7T875_6!7#6B5c826,7F5t6|7R6~7I7~5#7(8q778n8H7k6n8K7y8t385O0J8w7d0u4U7f8E7^8D8B7$8l8P3A5O0z8T7|8m8i4c7S7l7M8j6R8O2%5~5B6R7Z6)2`7X4~0@0K8T6;6E198(5g7:6{7U6P8#7u7l7}9f5l0@81997D5F6V8 8@8C897W8d7.638V658h8o8=8.7j7%948N0@8s7-6p7B9n5D8y5u8Y888/4x6w8p9S8r9U8k049H9Y8I950@8S9O83048g9I049!8;8M9(017P9F939*048+9-0/8-9;9K3{9w6p8~8T7%0O957+989L7$6`7=8A9s7p6O9C0@9ial6k4#9mag6k7%51859r8:9t4@9v8|a80@6(aa9}a101967,908eai7?9_7_9j3Aa3aT9laJ6T5G759;aD8b8ca+9#9:aY9=9|8Ga/8J9_9G8m9~6baP9x7E5s9RaV3!5,a;aca49?6^aKa?9~9,av6H9y0U9da;a.b28Za:8Kab9~a0beaW9h9Ebobabl880Qaua}b99/9z8Xby5_b88$a=bH8IbJawbx35917A0@brbC9Wbua45|8`a76w6r2s0L55afbWbPbE8W9Bbw04ay7486bsbT9 8,bYa?bO71a#9qbqb}apa`5}1a4v0B2z2!cb4f1t4h2C2E2A1!1$2C0u1Kce0n4g0_cr0Z0#0%04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+jtwki9][5hx)6050i0B0L0u0O0p0b0r0h0p0u0b0b0G010L0O0v010406050b0j0A0A0u0x0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0O0l0)0+0-0/0T0O0m0T0p1A0T0L0@050!0g0p0B1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0x1i0L0T0)140b0v0u0s0/0F011N1x010k0$0B0s0u0A0B1H1/1;1_1P1|1L1 210@0a0r0E0x0d0v0d0b0O170s0r0Y1-0x0x0B0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0O2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0x0~0p0@0r0y2w2+0^2*252-1P2/2;2?0F2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0H3g362+383m2?0S3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0P3Y2}3!3u040y0o3)3J2S3#3N0y2^1b2`3y3*3=3,0y333`353|3;2.3U3c0y3f422y1j2#1a2P2C0i2G380h1#221i4g1l4e2)4b1i4l0Y2$3Z3=0N0@0Y0k3q3I380M2?4E3R3~0k0@0b0d0}0B0e0~0U0O2;0B4J4y1`0?040D4Y3}2.0@0m0x0$1L4(451P4#0V0I3x0r4`0r4F3A0s0@0T0u160B0j0x3q4|4K1`0d0@0G574}3+0g0@294:384#4%4t5f3~4+4-0p4/5o594=0@0V4_4{5p4*040+0x0m54564t584Z1P5b045d5K5C2 5h5E1~5k3A5m5X3+5r4.4X5v5M0/4#0R5!3=0A0O0@3/5)4)5x040Q5z4t064{5L5^3l0@4T0O0b5e5w0/5O5Q2%604;5+0@0R5-5@6e015:5=675*014A040k3C6o61390@0e6v6k0d4H042U6A3t5U0x1;5H5.4!0@5n2)686x5E0 5H556M5_0V0Q6G3A6r6t5J6c5S62046z5R6R6C0@6F6/6p0s6I6K5(6Q6p5Z6j3t50520L5I6X6f046Z5A4`6+6S6466705Y6g766l5;045?6}6w4#0Q6i7o6k6m7m7j7q6#3!6a7z5q044,5%7x7i7g3!7v7n2`7c7q7s7N6R7L7H5`7a6d386%6u6@6w4 6E7C5a6D6?6*6R6_0@6J0s6L7J3=6 7t387v3_7`7h040C7)2 72536W7@6N784^5}5 5 7c7%7e7U7Q358e6=7U7r7j7T875_6!7#6B5c826,7F5t6|7R6~7I7~5#7(8q778n8H7k6n8K7y8t385O0J8w7d0u4U7f8E7^8D8B7$8l8P3A5O0z8T7|8m8i4c7S7l7M8j6R8O2%5~5B6R7Z6)2`7X4~0@0K8T6;6E198(5g7:6{7U6P8#7u7l7}9f5l0@81997D5F6V8 8@8C897W8d7.638V658h8o8=8.7j7%948N0@8s7-6p7B9n5D8y5u8Y888/4x6w8p9S8r9U8k049H9Y8I950@8S9O83048g9I049!8;8M9(017P9F939*048+9-0/8-9;9K3{9w6p8~8T7%0O957+989L7$6`7=8A9s7p6O9C0@9ial6k4#9mag6k7%51859r8:9t4@9v8|a80@6(aa9}a101967,908eai7?9_7_9j3Aa3aT9laJ6T5G759;aD8b8ca+9#9:aY9=9|8Ga/8J9_9G8m9~6baP9x7E5s9RaV3!5,a;aca49?6^aKa?9~9,av6H9y0U9da;a.b28Za:8Kab9~a0beaW9h9Ebobabl880Qaua}b99/9z8Xby5_b88$a=bH8IbJawbx35917A0@brbC9Wbua45|8`a76w6r2s0L55afbWbPbE8W9Bbw04ay7486bsbT9 8,bYa?bO71a#9qbqb}apa`5}1a4v0B2z2!cb4f1t4h2C2E2A1!1$2C0u1Kce0n4g0_cr0Z0#0%04.
Version itérative (2)

Là encore, il s'agit d'une version partant de la case d'origine et progressant jusqu'à la case finale.

On remarque toutefois ici que le calcul de maxis[i][j] ne fait intervenir que les valeurs du dessus et de gauche.

Il n'est donc pas nécessaire de stocker en mémoire l'ensemble du tableau maxis. On peut travailler avec une simple ligne ligne_maxis aussi large que la grille. Cette liste prend initialement comme valeurs les sommes maximales de chemins reliant l'origine à chacune des cases de la première ligne de la grille.

On met ensuite à jour cette liste ligne par ligne jusqu'à ce qu'elle contienne les valeurs de la dernière ligne. Pour ce faire on crée une liste temporaire qui correspondra à la ligne suivante. On la complète en utilisant les valeurs de la ligne actuelle. Cette ligne étant complète, on remplace ligne_maxis par cette nouvelle ligne.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+jtwki9][5hx)6050i0B0L0u0O0p0b0r0h0p0u0b0b0G010L0O0v010406050b0j0A0A0u0x0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0O0l0)0+0-0/0T0O0m0T0p1A0T0L0@050!0g0p0B1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0x1i0L0T0)140b0v0u0s0/0F011N1x010k0$0B0s0u0A0B1H1/1;1_1P1|1L1 210@0a0r0E0x0d0v0d0b0O170s0r0Y1-0x0x0B0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0O2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0x0~0p0@0r0y2w2+0^2*252-1P2/2;2?0F2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0H3g362+383m2?0S3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0P3Y2}3!3u040y0o3)3J2S3#3N0y2^1b2`3y3*3=3,0y333`353|3;2.3U3c0y3f423h3I3t470@0y3p4b2z2!0B2z2P2C0i2G380h1#221i4o1l2#3I2(2`054t0Y2$3Z3=0N0@0Y0k3q4d3A0M2?4N3R3~0k0@0b0d0}0B0e0~0U0O2;0B4S4H1`0?040D4+3}2.0@0m0x0$1L4;451P4.0V0I3x0r530r4O3+0@0T0u160B0j0x3q554T1`0d0@0G5f563~0g0@294|384.4:4j5n4?044^4`4*5w5h4~0@0V52545x2 5q0 0m5c5e4j5g4,1P5j045l5R5K3l5p045r5D5T0/5u5s3A0s4@4_0p4{5(4=5F040R5,3!0A0O0@3/5?4}5*0@0Q5H4j06545S5@3l5q1A2L4#0u4%0b5m5E0/5V5X2%6a62014.5`61385}5 6k5)014J040k3C6z6b390@0e6G6r0d4Q042U6L3t5#0x1;5O5{3=5+6v5-5M0x5O5d6X4-5G0Q5I535Z6I5$6e4!4$0O6j6!3!6t6*1P6x04602)6l6s646R3A6n77575z5:5=736A6}6{3=70724C744.0Q6u7f6H7k6~63046-67696:6C6E5Q6p6:5.040K7a3=6N0@6Q5Y740s6T6V5C7r6r6Z7U6w5~3-7u75040C7J5y0+6%5P7#4 517y695J7P6d0m6f6^6`7X3A7h7}7b7I7i6+7w7)5U5k866c7c5B7.0@7q7m6A7t835^7p7#7G82806Y767O6A5V0J896;1T7`6h6_8d5_8m0@8o2`6q385V0z8w703_8p847x2%687?6A7B6F8s6H7G0O8w7L6P198Y6r7Q0@6U0s6W8j7v5v8P6 7Z8O8g6H4.7(8*3t585a0L7-8;7$506.7=7F4W0j1t1;938$888 7~8e7#8i7E748W7D8H9a046K9i3!8%7N9n6A8,048.8:8@8=8E5$5N949F968R3{7=8U8Z9b9d0s9f957 8{6r9m9Y5t8r9z6H799v3~5/8c9W9k958!8C8l959!356:7o9g048v9+7*6?6g6i8C8f9`749_2y9{9%9O9P8I3A9p8w8n8$6O9y9r7P7R8/7T9#9j4/9l8_8C8~9(8+6$6(9qa77g5G7:8Sae997@040{9T9V9L9XaE9R7H9?9}6oan9A9-5;araS7V9:9L9=9/7wa6aaaL8Ga%9$85a0879~ai5#4$8C8?as7b8y6@8A7|b08q8D9;8F9?ayaYaTaN0l9ea$a/aFb8a*baa^6m0@8Lbo018N9?66aIae9sb2a38Bbs9*az90aM9cbg9Ubi0^7z9o8-0Z5d8)bF6#6=7_b3a4a,a.4GaT7+aC9}brbT5|awa,9N431a4E4m1j4z0n4x2A4q1a2D2C1!1$2C0u1Kb?b_1t2{b_0Z0#0%04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o_8bcdufvg/0ly n7apSr1-me,(P2=4:+jtwki9][5hx)6050i0B0L0u0O0p0b0r0h0p0u0b0b0G010L0O0v010406050b0j0A0A0u0x0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0O0l0)0+0-0/0T0O0m0T0p1A0T0L0@050!0g0p0B1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0x1i0L0T0)140b0v0u0s0/0F011N1x010k0$0B0s0u0A0B1H1/1;1_1P1|1L1 210@0a0r0E0x0d0v0d0b0O170s0r0Y1-0x0x0B0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0O2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0x0~0p0@0r0y2w2+0^2*252-1P2/2;2?0F2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0H3g362+383m2?0S3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0P3Y2}3!3u040y0o3)3J2S3#3N0y2^1b2`3y3*3=3,0y333`353|3;2.3U3c0y3f423h3I3t470@0y3p4b2z2!0B2z2P2C0i2G380h1#221i4o1l2#3I2(2`054t0Y2$3Z3=0N0@0Y0k3q4d3A0M2?4N3R3~0k0@0b0d0}0B0e0~0U0O2;0B4S4H1`0?040D4+3}2.0@0m0x0$1L4;451P4.0V0I3x0r530r4O3+0@0T0u160B0j0x3q554T1`0d0@0G5f563~0g0@294|384.4:4j5n4?044^4`4*5w5h4~0@0V52545x2 5q0 0m5c5e4j5g4,1P5j045l5R5K3l5p045r5D5T0/5u5s3A0s4@4_0p4{5(4=5F040R5,3!0A0O0@3/5?4}5*0@0Q5H4j06545S5@3l5q1A2L4#0u4%0b5m5E0/5V5X2%6a62014.5`61385}5 6k5)014J040k3C6z6b390@0e6G6r0d4Q042U6L3t5#0x1;5O5{3=5+6v5-5M0x5O5d6X4-5G0Q5I535Z6I5$6e4!4$0O6j6!3!6t6*1P6x04602)6l6s646R3A6n77575z5:5=736A6}6{3=70724C744.0Q6u7f6H7k6~63046-67696:6C6E5Q6p6:5.040K7a3=6N0@6Q5Y740s6T6V5C7r6r6Z7U6w5~3-7u75040C7J5y0+6%5P7#4 517y695J7P6d0m6f6^6`7X3A7h7}7b7I7i6+7w7)5U5k866c7c5B7.0@7q7m6A7t835^7p7#7G82806Y767O6A5V0J896;1T7`6h6_8d5_8m0@8o2`6q385V0z8w703_8p847x2%687?6A7B6F8s6H7G0O8w7L6P198Y6r7Q0@6U0s6W8j7v5v8P6 7Z8O8g6H4.7(8*3t585a0L7-8;7$506.7=7F4W0j1t1;938$888 7~8e7#8i7E748W7D8H9a046K9i3!8%7N9n6A8,048.8:8@8=8E5$5N949F968R3{7=8U8Z9b9d0s9f957 8{6r9m9Y5t8r9z6H799v3~5/8c9W9k958!8C8l959!356:7o9g048v9+7*6?6g6i8C8f9`749_2y9{9%9O9P8I3A9p8w8n8$6O9y9r7P7R8/7T9#9j4/9l8_8C8~9(8+6$6(9qa77g5G7:8Sae997@040{9T9V9L9XaE9R7H9?9}6oan9A9-5;araS7V9:9L9=9/7wa6aaaL8Ga%9$85a0879~ai5#4$8C8?as7b8y6@8A7|b08q8D9;8F9?ayaYaTaN0l9ea$a/aFb8a*baa^6m0@8Lbo018N9?66aIae9sb2a38Bbs9*az90aM9cbg9Ubi0^7z9o8-0Z5d8)bF6#6=7_b3a4a,a.4GaT7+aC9}brbT5|awa,9N431a4E4m1j4z0n4x2A4q1a2D2C1!1$2C0u1Kb?b_1t2{b_0Z0#0%04.