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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/PNnl12050u0P0N0b0M0V0D0d0J0V0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0V0c0=0h0U050R0|0~10120`0A04051i1b1l0R1i0`0u0M0q0*0,0.0:0E0M0x0E0V1z0E0N0^050#0I0V0P1u0-0/011y1A1C1A0N1I1K1G0N0C1j0N0E0*150D0A0b0U0:0X011M1w010v0%0P0U0b0w0P1G1)1+1:1O1?1K1_1{0^0a0d0S0C0h0A0h0D0M180U0d0Z1%0C0C0P0J2g1b1~0U1j0R1#2t1Y1!1Z1H0u200:1C0U1^2d1G1r1t0+1N2D0M2F0U0h2J1G0A2m1j2r2t2X0{1*2h2L1;2Q0C0 0V0^0d0W2q2#0_2!1 2%1O2)2+2-0X2:1+2=2r2C012`0b2,040d0j2~2s0`312^0:34360d0r3a302#323g2-0f3k3c3m3e330h2*352-0F3r2?2$1v2_3w2{370Q3B3d3E3f3G3y370G3K3t3M3v3x3h0s3S2@3U3o040W0i3Z3D2M3V3H0W2/1c2;3s3!3,3$0W2}3;2 3?3+2(3O360W393|3b3C3n410^0W3j453l3@403W4a3q4d3~484h3%3A4k473u3_3J4q3L3^493%3R4d1m2V1b2J2w0u1!2B3u0J2R1|1j4F1k4D2Z4B4L0Z2W3T3,0H0^0Z0v3k4r3U0z2-4%4w2(0v0^0D0h0~0P0k0 0e0M2+0P4,4X1;0@040K4~4f2_0^0x0C0%1K543 1O510o0t3r0d5j0d4(4Y4!0P4$4B4-1O4*375c3n4/044;4?4^0b4`4|0k2m0J5w3u51535r4 56040M5J3U510n3k5l5s3f0^0B5S3,5f5h4k5k5+5X5O0:4Z5Q5q2X5-555Z044_0M0D5$500^0l5~5P5R5N5^01510O61655d5_5#6b32685W5m1;0h5u5|6i5Y010H0J0^0T194}6f5K0^5)2X065,6D5@6c6q0^0M5=2;6F3n6I6o5.010h0^0y0y6P660w0M0^3)6x5T6z5i6E6*6j5P5{5}6$5%60625_642Z6p686a6_6Q0U5!6?670^0O6W6G6S046V4d6M4s57590V5b6:5 046|2;6,6@716{716 046e6}666h7a7m6R0^0L756N5z4=1{5C5E354@5H7o0^5M7u6G7r6^7l6`0^5V7x6p7r7t6L7y770m7C3u6Y4a7M040o6)6*5j7y5:0P1C6K2 7b3#707X6Q776U7)3U7+046#7P6g6(5*7;6D7y7r6.7-7k2 8e6O7h5e738i2s8k7s7-747 6681833^7d5a6w886y7j7q8l8D6%04698G8s8m0:7w5?7$7A8y2(4:7F4@5{5F7L8O72528M7S7{8S047(8v6G853:8I6;047W8R7Y7~8?7i7/8b8c7?0^7^0D8C7T6Q516A3=8c8d8{5`5D6n8$518p4W667R8t9k8r7!8j7U8K8U1O8x8/7D588B8h8)9o8M9r8q9t8u8`808T9y4s0I0^4_7-7O9b9c6+9e5A7G8Z7J5G2n9S9D9N3U7%9v0:8;7-8_7#9e9G9l6G5f9;8+9X8X7H4{9#8#8}8n8(8$9n9i7V9-338|9=9L8-aa9/a87.7:9V7|8@8 6B9W6Q5:2m0N0c0C1a9*8z9f4`6/a38P6=a68H977v8o9F8t3r6C5k8r0E0b170Pavaa9x9K9m9P04239(aG049A7f969s980^ao9U7=9e0,0C0xaU0CaW6Taa0Ua!a$ai9Ta-9m8Aa+9C8$8587aI9_73a:3}5+8r8gay6ka}bka40l9p6p6r6t6vaa5:0v3wa~0^0kaW6maxaY7Qa!0C1+a_a%aDaba#10a_aVai0o9Jad66bwbybn5_bBbZ6RbDa~bHbJa,9Ha.a5bM7raRaTbRbM5fbUbgaP9ebjb^aFbMba9Eb96Z86aMb$aXbV7Qb67gb 8Fc46!c3c1c5bbb4bd9u90am1;as0!avbEca7D9Y8Y9g8!9%b28Mb=0Na`a|afb$ahce9{2scq5Pa@bQa{c80^8.bF32cLbc89aj4q0R4U0P2t2Uc*4E1s4G2w2z2u0b1Jc-0R4F0`c`0!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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/PNnl12050u0P0N0b0M0V0D0d0J0V0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0V0c0=0h0U050R0|0~10120`0A04051i1b1l0R1i0`0u0M0q0*0,0.0:0E0M0x0E0V1z0E0N0^050#0I0V0P1u0-0/011y1A1C1A0N1I1K1G0N0C1j0N0E0*150D0A0b0U0:0X011M1w010v0%0P0U0b0w0P1G1)1+1:1O1?1K1_1{0^0a0d0S0C0h0A0h0D0M180U0d0Z1%0C0C0P0J2g1b1~0U1j0R1#2t1Y1!1Z1H0u200:1C0U1^2d1G1r1t0+1N2D0M2F0U0h2J1G0A2m1j2r2t2X0{1*2h2L1;2Q0C0 0V0^0d0W2q2#0_2!1 2%1O2)2+2-0X2:1+2=2r2C012`0b2,040d0j2~2s0`312^0:34360d0r3a302#323g2-0f3k3c3m3e330h2*352-0F3r2?2$1v2_3w2{370Q3B3d3E3f3G3y370G3K3t3M3v3x3h0s3S2@3U3o040W0i3Z3D2M3V3H0W2/1c2;3s3!3,3$0W2}3;2 3?3+2(3O360W393|3b3C3n410^0W3j453l3@403W4a3q4d3~484h3%3A4k473u3_3J4q3L3^493%3R4d1m2V1b2J2w0u1!2B3u0J2R1|1j4F1k4D2Z4B4L0Z2W3T3,0H0^0Z0v3k4r3U0z2-4%4w2(0v0^0D0h0~0P0k0 0e0M2+0P4,4X1;0@040K4~4f2_0^0x0C0%1K543 1O510o0t3r0d5j0d4(4Y4!0P4$4B4-1O4*375c3n4/044;4?4^0b4`4|0k2m0J5w3u51535r4 56040M5J3U510n3k5l5s3f0^0B5S3,5f5h4k5k5+5X5O0:4Z5Q5q2X5-555Z044_0M0D5$500^0l5~5P5R5N5^01510O61655d5_5#6b32685W5m1;0h5u5|6i5Y010H0J0^0T194}6f5K0^5)2X065,6D5@6c6q0^0M5=2;6F3n6I6o5.010h0^0y0y6P660w0M0^3)6x5T6z5i6E6*6j5P5{5}6$5%60625_642Z6p686a6_6Q0U5!6?670^0O6W6G6S046V4d6M4s57590V5b6:5 046|2;6,6@716{716 046e6}666h7a7m6R0^0L756N5z4=1{5C5E354@5H7o0^5M7u6G7r6^7l6`0^5V7x6p7r7t6L7y770m7C3u6Y4a7M040o6)6*5j7y5:0P1C6K2 7b3#707X6Q776U7)3U7+046#7P6g6(5*7;6D7y7r6.7-7k2 8e6O7h5e738i2s8k7s7-747 6681833^7d5a6w886y7j7q8l8D6%04698G8s8m0:7w5?7$7A8y2(4:7F4@5{5F7L8O72528M7S7{8S047(8v6G853:8I6;047W8R7Y7~8?7i7/8b8c7?0^7^0D8C7T6Q516A3=8c8d8{5`5D6n8$518p4W667R8t9k8r7!8j7U8K8U1O8x8/7D588B8h8)9o8M9r8q9t8u8`808T9y4s0I0^4_7-7O9b9c6+9e5A7G8Z7J5G2n9S9D9N3U7%9v0:8;7-8_7#9e9G9l6G5f9;8+9X8X7H4{9#8#8}8n8(8$9n9i7V9-338|9=9L8-aa9/a87.7:9V7|8@8 6B9W6Q5:2m0N0c0C1a9*8z9f4`6/a38P6=a68H977v8o9F8t3r6C5k8r0E0b170Pavaa9x9K9m9P04239(aG049A7f969s980^ao9U7=9e0,0C0xaU0CaW6Taa0Ua!a$ai9Ta-9m8Aa+9C8$8587aI9_73a:3}5+8r8gay6ka}bka40l9p6p6r6t6vaa5:0v3wa~0^0kaW6maxaY7Qa!0C1+a_a%aDaba#10a_aVai0o9Jad66bwbybn5_bBbZ6RbDa~bHbJa,9Ha.a5bM7raRaTbRbM5fbUbgaP9ebjb^aFbMba9Eb96Z86aMb$aXbV7Qb67gb 8Fc46!c3c1c5bbb4bd9u90am1;as0!avbEca7D9Y8Y9g8!9%b28Mb=0Na`a|afb$ahce9{2scq5Pa@bQa{c80^8.bF32cLbc89aj4q0R4U0P2t2Uc*4E1s4G2w2z2u0b1Jc-0R4F0`c`0!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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/Pnl12050u0P0N0b0M0U0D0d0J0U0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0U0c0;0h0T050R0{0}0 110_0A04051h1a1k0R1h0_0u0M0q0)0+0-0/0E0M0x0E0U1y0E0N0@050!0I0U0P1t0,0.011x1z1B1z0N1H1J1F0N0C1i0N0E0)140D0A0b0T0/0W011L1v010v0$0P0T0b0w0P1F1(1*1/1N1=1J1^1`0@0a0d0S0C0h0A0h0D0M170T0d0Y1$0C0C0P0J2f1a1}0T1i0R1!2s1X1Z1Y1G0u1 0/1B0T1@2c1F1q1s0*1M2C0M2E0T0h2I1F0A2l1i2q2s2W0`1)2g2K1:2P0C0~0U0@0d0V2p2!0^2Z1~2$1N2(2*2,0W2/1*2;2q2B012_0b2+040d0j2}2r0_302@0/33350d0r392 2!313f2,0f3j3b3l3d320h2)342,0F3q2=2#1u2^3v2`360Q3A3c3D3e3F3x360G3J3s3L3u3w3g0s3R2?3T3n040V0i3Y3C2L3U3G0V2.1b2:3r3Z3+3#0V2|3:2~3=3*2%3N350V383{2r1l2U1a2I2v0u1Z2A3t0J2Q1{1i491j472Y441i4f0Y2V3S3+0H0@0Y0v3j3B310z2,4y3K3@0v0@0D0h0}0P0k0~0e0M2*0P4D4s1:0?040K4S3?2%0@0x0C0$1J4Y3~1N4V0o0t3q0d4;0d4z3t0T0@0E0b160P0c0C3j4?4E1:0h0@0y514@3!0I0@224*314V4X4n593@4#4%0U4)5i534,0@0o4:4=5j4!040+0C0x4~504n524T1N5504575E5w2^5b5y1@5e3t5g5R3!5l4(4R5p5G0/4V0l5U3+0w0M0@3(5Z4Z5r040O5t4n064=5F5/3e0@4N0M0D585q0/5I5K2W5`4+5#0@0l5%5.68015*5,615!014u040v3v6i5{320@0k6p6e0h4B042N6u3m5O0C1*5B5(4U0@5h2Y626r5y0 5B4 6G5:0o0O6A3t6l6n5D665M5|046t5L6L6w0@6z6)6j0T6C6E5Y6K6j5T6d3m4`4|0N5C6R69046T5u4;6#6M5~606`5S6a706f5+045-6@6q4V0O6c7i6e6g7g7d7k6V3T647t5k044$5X7r7c7a3T7p7h2:767k7m7H6L7F7B5;7467316X6o6.6q4_6y7w546x6-6!6L6:0@6D0T6F7D3+6_7n317p3/7;7b040n7Z2^6|4}6Q7.6H724/5@5_5_767X787O7K2~886,7O7l7d7N815:6U7V6v567|6$7z5n6?7L6^7C7^5V7Y8k718h8B7e6h8E7s8n315I0L8q770b4O798y7/8x8v7W8f8J3t5I0m8N7?8g8c457M7f7G8d6L8I2W5^5v6L7T6Z2:7R4^0@0B8N6+6y198Y5a7*6=7O6J8V7o7f7@995f0@7{937x5z6P8_8.8w837Q877(5}8P5 8b8i8,8(7d7X8~8H0@8m7%6j7v9h5x8s5o8S828)4r6q8j9M8l9O8e049B9S8C8 0@8M9I7}048a9C049U8+8G9Y017J9z8}9!048#9%0/8%9+9E3;9q6j8^8N7X0M8 7#929F7W6;7,8u9m7j6I9w0@9caf6e4V9gaa6e7X4{7 9l8*9n4.9p8?a20@6Ya49@9{01907$8`88ac7-9:7:9d3t9}aN9faD6N5A6 9+ax8586a#9V9*aS9,9?8Aa)8D9:9A8g9^65aJ9r7y5m9LaP3T5$a+a69~9-6/aEa-9^9$ap6B9s0e97a+a(a|8Ta*8Ea59^9`b8aQ9b9ybib4bf820Oaoa@b39)9t8Rbs5:b28Wa,bB8CbDaqbr2~8{7u0@blbw9Qbo9~5?8;a16q6l2l0N4 a9bQbJby8Q9vbq04as6~80bmbN9_8$bSa-bI6{aV9kbkb@aja;5@1a4p0P2s2Tc5481r4a2v2y2t0b1Ic80R490_ci0Z0#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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/Pnl12050u0P0N0b0M0U0D0d0J0U0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0U0c0;0h0T050R0{0}0 110_0A04051h1a1k0R1h0_0u0M0q0)0+0-0/0E0M0x0E0U1y0E0N0@050!0I0U0P1t0,0.011x1z1B1z0N1H1J1F0N0C1i0N0E0)140D0A0b0T0/0W011L1v010v0$0P0T0b0w0P1F1(1*1/1N1=1J1^1`0@0a0d0S0C0h0A0h0D0M170T0d0Y1$0C0C0P0J2f1a1}0T1i0R1!2s1X1Z1Y1G0u1 0/1B0T1@2c1F1q1s0*1M2C0M2E0T0h2I1F0A2l1i2q2s2W0`1)2g2K1:2P0C0~0U0@0d0V2p2!0^2Z1~2$1N2(2*2,0W2/1*2;2q2B012_0b2+040d0j2}2r0_302@0/33350d0r392 2!313f2,0f3j3b3l3d320h2)342,0F3q2=2#1u2^3v2`360Q3A3c3D3e3F3x360G3J3s3L3u3w3g0s3R2?3T3n040V0i3Y3C2L3U3G0V2.1b2:3r3Z3+3#0V2|3:2~3=3*2%3N350V383{2r1l2U1a2I2v0u1Z2A3t0J2Q1{1i491j472Y441i4f0Y2V3S3+0H0@0Y0v3j3B310z2,4y3K3@0v0@0D0h0}0P0k0~0e0M2*0P4D4s1:0?040K4S3?2%0@0x0C0$1J4Y3~1N4V0o0t3q0d4;0d4z3t0T0@0E0b160P0c0C3j4?4E1:0h0@0y514@3!0I0@224*314V4X4n593@4#4%0U4)5i534,0@0o4:4=5j4!040+0C0x4~504n524T1N5504575E5w2^5b5y1@5e3t5g5R3!5l4(4R5p5G0/4V0l5U3+0w0M0@3(5Z4Z5r040O5t4n064=5F5/3e0@4N0M0D585q0/5I5K2W5`4+5#0@0l5%5.68015*5,615!014u040v3v6i5{320@0k6p6e0h4B042N6u3m5O0C1*5B5(4U0@5h2Y626r5y0 5B4 6G5:0o0O6A3t6l6n5D665M5|046t5L6L6w0@6z6)6j0T6C6E5Y6K6j5T6d3m4`4|0N5C6R69046T5u4;6#6M5~606`5S6a706f5+045-6@6q4V0O6c7i6e6g7g7d7k6V3T647t5k044$5X7r7c7a3T7p7h2:767k7m7H6L7F7B5;7467316X6o6.6q4_6y7w546x6-6!6L6:0@6D0T6F7D3+6_7n317p3/7;7b040n7Z2^6|4}6Q7.6H724/5@5_5_767X787O7K2~886,7O7l7d7N815:6U7V6v567|6$7z5n6?7L6^7C7^5V7Y8k718h8B7e6h8E7s8n315I0L8q770b4O798y7/8x8v7W8f8J3t5I0m8N7?8g8c457M7f7G8d6L8I2W5^5v6L7T6Z2:7R4^0@0B8N6+6y198Y5a7*6=7O6J8V7o7f7@995f0@7{937x5z6P8_8.8w837Q877(5}8P5 8b8i8,8(7d7X8~8H0@8m7%6j7v9h5x8s5o8S828)4r6q8j9M8l9O8e049B9S8C8 0@8M9I7}048a9C049U8+8G9Y017J9z8}9!048#9%0/8%9+9E3;9q6j8^8N7X0M8 7#929F7W6;7,8u9m7j6I9w0@9caf6e4V9gaa6e7X4{7 9l8*9n4.9p8?a20@6Ya49@9{01907$8`88ac7-9:7:9d3t9}aN9faD6N5A6 9+ax8586a#9V9*aS9,9?8Aa)8D9:9A8g9^65aJ9r7y5m9LaP3T5$a+a69~9-6/aEa-9^9$ap6B9s0e97a+a(a|8Ta*8Ea59^9`b8aQ9b9ybib4bf820Oaoa@b39)9t8Rbs5:b28Wa,bB8CbDaqbr2~8{7u0@blbw9Qbo9~5?8;a16q6l2l0N4 a9bQbJby8Q9vbq04as6~80bmbN9_8$bSa-bI6{aV9kbkb@aja;5@1a4p0P2s2Tc5481r4a2v2y2t0b1Ic80R490_ci0Z0#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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/Pnl12050u0P0N0b0M0U0D0d0J0U0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0U0c0;0h0T050R0{0}0 110_0A04051h1a1k0R1h0_0u0M0q0)0+0-0/0E0M0x0E0U1y0E0N0@050!0I0U0P1t0,0.011x1z1B1z0N1H1J1F0N0C1i0N0E0)140D0A0b0T0/0W011L1v010v0$0P0T0b0w0P1F1(1*1/1N1=1J1^1`0@0a0d0S0C0h0A0h0D0M170T0d0Y1$0C0C0P0J2f1a1}0T1i0R1!2s1X1Z1Y1G0u1 0/1B0T1@2c1F1q1s0*1M2C0M2E0T0h2I1F0A2l1i2q2s2W0`1)2g2K1:2P0C0~0U0@0d0V2p2!0^2Z1~2$1N2(2*2,0W2/1*2;2q2B012_0b2+040d0j2}2r0_302@0/33350d0r392 2!313f2,0f3j3b3l3d320h2)342,0F3q2=2#1u2^3v2`360Q3A3c3D3e3F3x360G3J3s3L3u3w3g0s3R2?3T3n040V0i3Y3C2L3U3G0V2.1b2:3r3Z3+3#0V2|3:2~3=3*2%3N350V383{3a3B3m400@0V3i442s2T0P2s2I2v0u1Z2A3t0J2Q1{1i4h1j2U3B2X2:054n0Y2V3S3+0H0@0Y0v3j463t0z2,4H3K3@0v0@0D0h0}0P0k0~0e0M2*0P4M4B1:0?040K4#3?2%0@0x0C0$1J4+3~1N4(0o0t3q0d4}0d4I3!0@0E0b160P0c0C3j4 4N1:0h0@0y59503@0I0@224?314(4*4c5h4-044/4;4!5q5b4^0@0o4|4~5r2^5k0 0x56584c5a4$1N5d045f5L5E3e5j045l5x5N0/5o5m3t0T4.4:0U4=5Y4,5z040l5$3T0w0M0@3(5-4@5!0@0O5B4c064~5M5.3e5k1y2E4V0b4X0D5g5y0/5P5R2W645|014(5;5{315@5_6e5Z014D040v3v6t65320@0k6A6l0h4K042N6F3m5V0C1*5I5=3+5#6p5%5G0C5I576R4%5A0O5C4}5T6C5W684U4W0M6d6U3T6n6!1N6r045`2Y6f6m5~6L3t6h71515t5*5,6}6u6@6=3+6`6|4w6~4(0O6o796B7e6^5}046%61636*6w6y5K6j6*5(040B743+6H0@6K5S6~0T6N6P5w7l6l6T7O6q5^3$7o6 040n7D5s0+6X5J7V4_4{7s635D7J670x696/6;7R3t7b7@757C7c6#7q7Z5O5e8066765v7(0@7k7g6u7n7}5/7j7V7A7|7`6S707I6u5P0L836+1R7;6b6:875:8g0@8i2:6k315P0m8q6`3/8j7~7r2W627-6u7v6z8m6B7A0M8q7F6J198S6l7K0@6O0T6Q8d7p5p8J6_7T8I8a6B4(7Y8!3m52540N7%8+7W4`6(7,7z4Q0c1r1*8}8W828_7^887V8c7y6~8Q7x8B94046E9c3T8X7H9h6u8$048(8*8.8,8y5W5H8~9z908L3;7,8O8T95970T998 7_8=6l9g9S5n8l9t6B739p3@5)869Q9e8 8U8w8f8 9U2~6*7i9a048p9#7!6-6a6c8w899;6~9:2r9=9X9I9J8C3t9j8q8h8W6I9s9l7J7L8)7N9V9d4)9f8:8w8^9Y8#6W6Y9ka17a5A7*8Ma8937.040{9N9P9F9Ray9L7B9-9@6iah9u9%5+alaM7P9*9F9,9)7qa0a4aF8AaX9W7 9`819^ac5V4W8w8-am758s6.8u7?a`8k8x9+8z9-asaSaNaH0q98aWa)azb2a!b4a/6g0@8Fbi018H9-60aCa89ma|9}8vbm9!at8`aG96ba9Obc0^7t9i8%0Z578Zbz6V6,7:a}9~a$a(4AaN7#aw9@blbN5?aqa$9H3|1a4y4f1l4t0R4r2t4j1a2wb@0b1Ib-b:1r2;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

.128013au x5So03_[-,)yv49:dfmg=wpjrsh68kbc(+it]e7/Pnl12050u0P0N0b0M0U0D0d0J0U0b0D0D0y010N0M0A010406050D0c0w0w0b0C0p040g0h0U0c0;0h0T050R0{0}0 110_0A04051h1a1k0R1h0_0u0M0q0)0+0-0/0E0M0x0E0U1y0E0N0@050!0I0U0P1t0,0.011x1z1B1z0N1H1J1F0N0C1i0N0E0)140D0A0b0T0/0W011L1v010v0$0P0T0b0w0P1F1(1*1/1N1=1J1^1`0@0a0d0S0C0h0A0h0D0M170T0d0Y1$0C0C0P0J2f1a1}0T1i0R1!2s1X1Z1Y1G0u1 0/1B0T1@2c1F1q1s0*1M2C0M2E0T0h2I1F0A2l1i2q2s2W0`1)2g2K1:2P0C0~0U0@0d0V2p2!0^2Z1~2$1N2(2*2,0W2/1*2;2q2B012_0b2+040d0j2}2r0_302@0/33350d0r392 2!313f2,0f3j3b3l3d320h2)342,0F3q2=2#1u2^3v2`360Q3A3c3D3e3F3x360G3J3s3L3u3w3g0s3R2?3T3n040V0i3Y3C2L3U3G0V2.1b2:3r3Z3+3#0V2|3:2~3=3*2%3N350V383{3a3B3m400@0V3i442s2T0P2s2I2v0u1Z2A3t0J2Q1{1i4h1j2U3B2X2:054n0Y2V3S3+0H0@0Y0v3j463t0z2,4H3K3@0v0@0D0h0}0P0k0~0e0M2*0P4M4B1:0?040K4#3?2%0@0x0C0$1J4+3~1N4(0o0t3q0d4}0d4I3!0@0E0b160P0c0C3j4 4N1:0h0@0y59503@0I0@224?314(4*4c5h4-044/4;4!5q5b4^0@0o4|4~5r2^5k0 0x56584c5a4$1N5d045f5L5E3e5j045l5x5N0/5o5m3t0T4.4:0U4=5Y4,5z040l5$3T0w0M0@3(5-4@5!0@0O5B4c064~5M5.3e5k1y2E4V0b4X0D5g5y0/5P5R2W645|014(5;5{315@5_6e5Z014D040v3v6t65320@0k6A6l0h4K042N6F3m5V0C1*5I5=3+5#6p5%5G0C5I576R4%5A0O5C4}5T6C5W684U4W0M6d6U3T6n6!1N6r045`2Y6f6m5~6L3t6h71515t5*5,6}6u6@6=3+6`6|4w6~4(0O6o796B7e6^5}046%61636*6w6y5K6j6*5(040B743+6H0@6K5S6~0T6N6P5w7l6l6T7O6q5^3$7o6 040n7D5s0+6X5J7V4_4{7s635D7J670x696/6;7R3t7b7@757C7c6#7q7Z5O5e8066765v7(0@7k7g6u7n7}5/7j7V7A7|7`6S707I6u5P0L836+1R7;6b6:875:8g0@8i2:6k315P0m8q6`3/8j7~7r2W627-6u7v6z8m6B7A0M8q7F6J198S6l7K0@6O0T6Q8d7p5p8J6_7T8I8a6B4(7Y8!3m52540N7%8+7W4`6(7,7z4Q0c1r1*8}8W828_7^887V8c7y6~8Q7x8B94046E9c3T8X7H9h6u8$048(8*8.8,8y5W5H8~9z908L3;7,8O8T95970T998 7_8=6l9g9S5n8l9t6B739p3@5)869Q9e8 8U8w8f8 9U2~6*7i9a048p9#7!6-6a6c8w899;6~9:2r9=9X9I9J8C3t9j8q8h8W6I9s9l7J7L8)7N9V9d4)9f8:8w8^9Y8#6W6Y9ka17a5A7*8Ma8937.040{9N9P9F9Ray9L7B9-9@6iah9u9%5+alaM7P9*9F9,9)7qa0a4aF8AaX9W7 9`819^ac5V4W8w8-am758s6.8u7?a`8k8x9+8z9-asaSaNaH0q98aWa)azb2a!b4a/6g0@8Fbi018H9-60aCa89ma|9}8vbm9!at8`aG96ba9Obc0^7t9i8%0Z578Zbz6V6,7:a}9~a$a(4AaN7#aw9@blbN5?aqa$9H3|1a4y4f1l4t0R4r2t4j1a2wb@0b1Ib-b:1r2;b:0Z0#0%04.