Plus longues sous-suites communes

Considérons les deux « textes » "LAPIN" et "CAPRIN".

À quel point sont-ils proches ?

Pour répondre à cette question, on peut se demander quelle est la plus longue sous-suite commune à ces deux textes.

Définition

On appelle sous-suite d'une chaîne de caractères, une chaîne produite en enlevant zéro, un ou plusieurs caractères.

Par exemple, "AN" est une sous-suite de "LAPIN".

"AN' est aussi une sous-suite commune à "LAPIN" et "CAPRIN".

Dans certains cas, il peut y avoir plusieurs sous-suites communes de longueurs identiques. Par exemple les chaînes "abc" et "bac" admettent deux sous-suites communes de longueur 2 : "ac" et "bc".

On va donc plutôt calculer la longueur de la plus longue sous-suite commune aux deux textes.

La comparaison de "LAPIN" et "CAPRIN" donne ceci (sur fond vert les caractères "identiques", sur fond rouge les "différents") :

LAPIN

CAPRIN

La plus longue sous-suite commune est donc "APIN". Elle est de longueur 4.

Écrire la fonction lplssc (pour longueur plus longue sous-suite commune) qui prend en argument les deux textes à comparer (texte_a et texte_b) et renvoie la longueur de la plus longue sous-suite commune.

On propose deux versions de cette fonction : une version récursive utilisant la mémoïsation et une itérative.

Exemples
>>> lplssc("LAPIN", "CAPRIN")
4
>>> lplssc("abcd", "abcde")
4
>>> lplssc("aBaBaBaB", "aaa")
3
Aide

Une approche consiste à déterminer les longueurs des plus longues sous-suites communes de toutes les versions de chaque texte : la version à 0 caractère, la version à 1 caractère, etc. Il y a (1 + len(texte_a)) × (1 + len(texte_b)) cas à envisager.

En prenant encore une fois texte_a = "LAPIN" et texte_b = "CAPRIN", les différents cas envisagés apparaissent dans le tableau ci-dessous. On trouve dans chaque case la longueur de la plus longue sous-suite commune à chaque texte s'il s'arrêtait au caractère indiqué en début de ligne ou de colonne.

Ainsi, le 1 au bout de la double flèche est la longueur de la plus longue sous-suite commune aux textes "LA" et "CAPRI".

Tableau de longueurs

On constate que :

  • la première colonne et la première ligne du tableau ne contiennent que des 0. C'est en effet la longueur de la plus longue sous-suite commune dans le cas où l'un des textes est vide ;

  • si les derniers caractères considérés sont identiques, ce caractère commun fait partie de la sous-suite commune. On peut le supprimer et ajouter 1 au résultat de la case au dessus à gauche (flèche en diagonale);

  • si les derniers caractères considérés diffèrent, l'un des deux caractères (ou les deux) ne fait pas partie de la sous-suite commune. On compare les valeurs des cases de gauche et du dessus (flèches horizontale et verticale).

Version récursive

Cette fonction fait appel à la fonction récursive lplssc_rec qui prend en paramètres le nombre de caractères de chaque texte à comparer taille_a et taille_b. Cette fonction renvoie la longueur de la plus longue sous-suite commune aux taille_a premiers caractères de texte_a et aux taille_b premiers caractères de texte_b.

Par exemple, avec texte_a = "LAPIN" et texte_b = "CAPRIN", l'appel lplssc_rec(2, 5) renvoie la longueur de la plus longue sous-suite commune à "LA" et "CAPRI".

On gardera trace des résultats intermédiaires dans un dictionnaire longueurs qui, à chaque couple (taille_a, taille_b), associe la longueur de la plus longue sous-suite commune.

La fonction étant récursive, on débutera par l'appel prenant en compte tous les caractères de chaque texte.

###(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

.128013,è Ow5e(?8CR0pkDojicE6S1vq{d:xy24flïn-]93m=)rh[u}s;b/.àt_géaPQ+7050C0h0(0,0t0J0Y0d0u0J0,0Y0Y0R010(0t0o010406050Y0W0Q0Q0,0T0F040x0r0J0W140r0L0d020,0Q0o0Z0d0m0h1e0T0A0W0h0Y050#1b1d1f1h190o041F1M051P0#1P1R1M190C0t0z0|0~10120U0t0*0U0J1)0U0(17050@0!0J0h1!0 11011(1*1,1*0(1=1@1:0(0!0r0C1h1;0T1N0(0U0|1k0Y0o0,0L120G011_1$010I0_0h0L1s0h1:2h2j2o1{2r1@2u0Q2w040a0d0-0T0r0o0r0Y0t1n1p0=2f0T0T0h0u2R1F2y0L1N0#2d2%0(2b2a2c0C2A121,0L2t2O1:1X1Z0}1`2;0t2?0L271Y1:0o2W1N2#2%381a2i1p2|2p310T1e0J170d0y2!3c183b2z3e1{3g3i3k0G3n2j3p2#2:013u0,3j040d0P3y2$193B3s123E3G0d0H3K3A3c3C3Q3k0g3U3M3W3O3D0r3h3F3k0w3#3q3d1#3t3*3v3H0:3/3N3=3P3@3,3H0k3{3%3}3)3+3R0O433r453Y040y0n4a3;2}463^0y3m1G3o3$4b4j4d0y3x4o3z4q4i3f3 3G0y3J4w3L3:3X4B170y3T4F3V4r4A474K3!4N1O361F2`2*0C2.3C0u272G0;1Y1N350h373o3U054%0=4/4P1{0p170=0I4;3|4j0f3k4 444s0I170J0o0`0Y0u544_1216040i5e4z3t170(0h0E5o0)0,5k3C5h0b3U0d4H3(0L5n5p5r0!5u3(5h0S0D3#0d5N5z502p4{044}5H45523H5V56585a100u0)2W5d4U5Q1{5h5j5,553f5n0^0J1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170t4~4N6f675C040@630h5{6l604j0r170R0R5 5-120Q0t174g6u6C010r5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0(0W0T0L6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170S7a3(6L17310(7y457A786|7p6n581o0*1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040V7u3D6R5`7+6V7Y6K170M7E4j704n7k675h0N7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170N7U4x7W7W7_6o0J7M7O0T7Q817S170V7d4:7f8j7j8K7l5~8l616p7s8k8F7-0S848R6w6y8o6D6F4e8%7`040/8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0h0`0h8^8u3L9q6;9a8A0L7N0h7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0!171e0E8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0Sa29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040B0XaA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0#4Y1F0(4!bL2,2(26282*0,1?bI4Y1L4^6~2W0Q0)0I0,0p6s0U0P171x1z1B1D0d9y2%1V1Q040q2j0{0~0d0I1o2Y0t1o0d352 0u153F1^c54%1d2t0u1^2i0T0|0T0+0hck1@0d1Xc31o2u0t2W5zbFa;9E8C7Qcz0d2 2Q0tcb2F0L0(0d0z0t2T1B0tc6co2F210T0,cr1^051y040Q0+0Q0r0K0Yco1Fc$0$060e1p0~0Lch0d2t1b2Q1^1@0{0,0o0o9u0{cm0u7P6j0{2t0dc-cZ1e0L0C2jcMb;6Sc{0YcMb aP8CcZ0db 5a0Wb~a=dd0rdx0Mc}5o2f1d0W2?ddcS0J00cd1o2P0C0c2W060(dB5ob~b=1@cWb=2T0u0U0,b;0d5o8cb?cy4(aO9/b80i2D0id-5r0,a7du2td`bl0!0SbCcE0j1O3p1M0l0rcfducY0YdB0Y0Mc1c_2RdncMd7d90z0h0bcF0Jen0d262S1^0C0+0!1mcoc61f0ddI0|0 dt0!0 0hc;0l001DcM0tc9d eK0{dBdu00eJ0=0{0=0W0Ed,7)0{dJ4%cL0t2tcM0,0Wd83d1f0,2YdSeP0db|0L0{c`0u0 etc52W0L0z0re?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0#cz0$e8bYc?cN0+0T6jffc|0Wc~0dd+cqf7d10d0+0(0+d,cX2QfUe!310L0$2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0)e3bEd;060LeSdoeG0{350+c-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0ug5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0W0J3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0Yf91p2i101^e_e,f7g(0(f0g8d70+g?0(dbdpdN1p0,0sdWc!bFfo1-1 1.2x9kaw4;fyd;0de_0dcm1b0J0@cM0Z1FgV19gVgXb=h1e~h3g*fg0I0If0cLg`fR6_1Xc d$9Gh0eLg9c90Yg/cje#0+f!0u0+f$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0*cXdhgqhD1FgSgs0.1Cevd+eg2QeXfPc{fc0t0Y0,0*0+etb 0zcb6`ew0t1dh7cIfje@dddV0u0pcncrgecqggc40Lgihhd;gmaRfzfBb`0vezg!eF1,9GhRfbfdffiritckfNhccNe?g;0C002 h$2Wckdih?iJh^iLiN0de!f*cqcRhSgGcr0+0s0%c6hwe@ePiTbJ0?5^0Y04.

###(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

.128013,è Ow5e(?8CR0pkDojicE6S1vq{d:xy24flïn-]93m=)rh[u}s;b/.àt_géaPQ+7050C0h0(0,0t0J0Y0d0u0J0,0Y0Y0R010(0t0o010406050Y0W0Q0Q0,0T0F040x0r0J0W140r0L0d020,0Q0o0Z0d0m0h1e0T0A0W0h0Y050#1b1d1f1h190o041F1M051P0#1P1R1M190C0t0z0|0~10120U0t0*0U0J1)0U0(17050@0!0J0h1!0 11011(1*1,1*0(1=1@1:0(0!0r0C1h1;0T1N0(0U0|1k0Y0o0,0L120G011_1$010I0_0h0L1s0h1:2h2j2o1{2r1@2u0Q2w040a0d0-0T0r0o0r0Y0t1n1p0=2f0T0T0h0u2R1F2y0L1N0#2d2%0(2b2a2c0C2A121,0L2t2O1:1X1Z0}1`2;0t2?0L271Y1:0o2W1N2#2%381a2i1p2|2p310T1e0J170d0y2!3c183b2z3e1{3g3i3k0G3n2j3p2#2:013u0,3j040d0P3y2$193B3s123E3G0d0H3K3A3c3C3Q3k0g3U3M3W3O3D0r3h3F3k0w3#3q3d1#3t3*3v3H0:3/3N3=3P3@3,3H0k3{3%3}3)3+3R0O433r453Y040y0n4a3;2}463^0y3m1G3o3$4b4j4d0y3x4o3z4q4i3f3 3G0y3J4w3L3:3X4B170y3T4F3V4r4A474K3!4N1O361F2`2*0C2.3C0u272G0;1Y1N350h373o3U054%0=4/4P1{0p170=0I4;3|4j0f3k4 444s0I170J0o0`0Y0u544_1216040i5e4z3t170(0h0E5o0)0,5k3C5h0b3U0d4H3(0L5n5p5r0!5u3(5h0S0D3#0d5N5z502p4{044}5H45523H5V56585a100u0)2W5d4U5Q1{5h5j5,553f5n0^0J1@5s5Z2p5w5y5A4c5@0_5`5G5;5f015J5L4N065O6d5P5=4`170t4~4N6f675C040@630h5{6l604j0r170R0R5 5-120Q0t174g6u6C010r5X3*6B6g3P625_6s65386m5l126x046z6O676E6G5|5.176a386c6e6:6v5R172W0(0W0T0L6$6X016(046H6.6:5N6=6h046j6}5v175:3a6J6o6q6S6t7e6P68175x6I7l7g5^646*5g170S7a3(6L17310(7y457A786|7p6n581o0*1C6`1E666~5h6-4p746e76125S797J6~7g5E6s5t7R7b040V7u3D6R5`7+6V7Y6K170M7E4j704n7k675h0N7}2p6Z6#7$3X5D5q6T7:5h7/7,5B7=8d897z7{851{7 8e170N7U4x7W7W7_6o0J7M7O0T7Q817S170V7d4:7f8j7j8K7l5~8l616p7s8k8F7-0S848R6w6y8o6D6F4e8%7`040/8+8z5$5c5)2X8r5i7:7r6r8N3z6W3C6Z7|8!2p8q8h458Q7^8L8T8|6U3o8 8m0492997l958W5I7w5M8w756J5S0h0`0h8^8u3L9q6;9a8A0L7N0h7P8^8I8`8M7@8O827n8/8M9d3z7_5J8Z9j67878/0!171e0E8^8J8v9A8x9C8;5(5*9)9K9b7i9M8~7_918+9l9N8G047o9X7%9R8^0Sa29e8y5#5b9:8@964j5/9?7h7?8^a89`9aaj8Va96J9|938p8)809 8X9p9,9r8P9o6b9-7l5S6^6`7Ia38a049D9F9Haf5}8H9*2$aa9@akaS6+a19QaYaq9T6J9V3#6/aC7KaO8B9G8D8+9Zau7v040B0XaA9f45aI0?aKa%59ac8?5+9m977c8`9#aO2t9=a!6Q6p7)8}aWa+7wam2$b04sbe2Dbhba4s8b5Fa67x6b1F4?4.4VbG0#4Y1F0(4!bL2,2(26282*0,1?bI4Y1L4^6~2W0Q0)0I0,0p6s0U0P171x1z1B1D0d9y2%1V1Q040q2j0{0~0d0I1o2Y0t1o0d352 0u153F1^c54%1d2t0u1^2i0T0|0T0+0hck1@0d1Xc31o2u0t2W5zbFa;9E8C7Qcz0d2 2Q0tcb2F0L0(0d0z0t2T1B0tc6co2F210T0,cr1^051y040Q0+0Q0r0K0Yco1Fc$0$060e1p0~0Lch0d2t1b2Q1^1@0{0,0o0o9u0{cm0u7P6j0{2t0dc-cZ1e0L0C2jcMb;6Sc{0YcMb aP8CcZ0db 5a0Wb~a=dd0rdx0Mc}5o2f1d0W2?ddcS0J00cd1o2P0C0c2W060(dB5ob~b=1@cWb=2T0u0U0,b;0d5o8cb?cy4(aO9/b80i2D0id-5r0,a7du2td`bl0!0SbCcE0j1O3p1M0l0rcfducY0YdB0Y0Mc1c_2RdncMd7d90z0h0bcF0Jen0d262S1^0C0+0!1mcoc61f0ddI0|0 dt0!0 0hc;0l001DcM0tc9d eK0{dBdu00eJ0=0{0=0W0Ed,7)0{dJ4%cL0t2tcM0,0Wd83d1f0,2YdSeP0db|0L0{c`0u0 etc52W0L0z0re?crcw2X5ocKcM4=4(3C1}1+1-1/bZ3C70724:0#cz0$e8bYc?cN0+0T6jffc|0Wc~0dd+cqf7d10d0+0(0+d,cX2QfUe!310L0$2JdBckchb c5de0=dg2T2Pee1!fUfm4@d`8U5setap0)e3bEd;060LeSdoeG0{350+c-cLeAb}eXcs2Rcvcxf^4.dra?cDd;fA1Se91icS0ug5dp1^fPet0_c0e_cM2+0^5of)0?dFcecj0^eg1p6ab_0W0J3p1,04f;d0cZ6{e?8DeKcXe 2Wf5dPcPfFgadAcLcF0=e=b;0Yf91p2i101^e_e,f7g(0(f0g8d70+g?0(dbdpdN1p0,0sdWc!bFfo1-1 1.2x9kaw4;fyd;0de_0dcm1b0J0@cM0Z1FgV19gVgXb=h1e~h3g*fg0I0If0cLg`fR6_1Xc d$9Gh0eLg9c90Yg/cje#0+f!0u0+f$fD5ae~gdf4gfeVgh0^cxcqhwgShzeXdw0{0*cXdhgqhD1FgSgs0.1Cevd+eg2QeXfPc{fc0t0Y0,0*0+etb 0zcb6`ew0t1dh7cIfje@dddV0u0pcncrgecqggc40Lgihhd;gmaRfzfBb`0vezg!eF1,9GhRfbfdffiritckfNhccNe?g;0C002 h$2Wckdih?iJh^iLiN0de!f*cqcRhSgGcr0+0s0%c6hwe@ePiTbJ0?5^0Y04.
Version itérative

Dans cette version itérative on détermine là encore les longueurs des plus longues sous-suites communes de toutes les versions de chaque texte.

On peut toutefois remarquer que les deux formules de récurrences (derniers caractères identiques ou différents) ne font intervenir que deux lignes à la fois. On peut donc compléter le tableau ligne par ligne en partant de la première et en ne gardant trace que de la dernière ligne complétée.

Une seule ligne est nécessaire

###(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

.128013,è Ow5e(8CR0pkoic6S1vqd:xy24fln-]93m=)rhê[us;b/.àt_gLéaP+7050x0h0Y0%0q0E0S0d0r0E0%0S0S0L010Y0q0n010406050S0R0K0K0%0N0A040t0p0E0R0~0p0F0d020%0K0n0T0d0l0h180N0w0R0h0S050V1517191b130n041z1G051J0V1J1L1G130x0q0v0?0^0`0|0O0q0!0O0E1Z0O0Y11050.0U0E0h1U0_0{011Y1!1$1!0Y1,1.1*0Y0U0p0x1b1+0N1H0Y0O0?1e0S0n0%0F0|0B011:1W010D0:0h0F1m0h1*2b2d2i1=2l1.2o0K2q040a0d0(0N0p0n0p0S0q1h1j0,290N0N0h0r2L1z2s0F1H0V272X0Y2524260x2u0|1$0F2n2I1*1R1T0@1;2+0q2-0F211S1*0n2Q1H2V2X32142c1j2?2j2{0N180E110d0u2U3612352t381=3a3c3e0B3h2d3j2V2*013o0%3d040d0J3s2W133v3m0|3y3A0d0C3E3u363w3K3e0g3O3G3Q3I3x0p3b3z3e0s3V3k371V3n3!3p3B0*3)3H3,3J3.3$3B0j3=3X3@3Z3#3L0I3}3l3 3S040u0m443+2@403/0u3g1A3i1I301z2;2!0x2(3w0r212A0+1S1H2 0h314j4i3t054s0,4A454d0o110,0D3O3*3w0f3e4O3?4d0F0D110E0n0;0S0r4T3~4d10040i4(4I39110Y0h0z4=0Z0%4.4c2j4+0b3O0d4P3Y0F4;4?4^0U4{3w4+0M0y3V0d5f514U4:040E1i0!1w0R0N1y4C2W5h4)2j0p110L50523 4+0Q593Y0K0q114a5s3B5B4J110D3!5A5i3n110Z5S5v1=0p4R042_5X4/3n0U110N2d0!0h5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0h4_611=5b5(4|5Z110)6a3w5H114h345T0|5b0H5e5g5_1=4K045Q0N6f534;0/0E1.0Z585L5u5)0|5!115%6F6r3J5{5-0F5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110M6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0F7A3x6P5.5:7p6H6$6V6/7O0F6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040M6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0q4N8C6y7$6?8y4D757n8v7f6A857-110G8F7s738Y7q4+7`8b7O6}0L5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040H8K3i8M8N8N7;7#7g0n7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110h0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180z8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0h5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0Y5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0V4n1z0Y4pbf2$2Y20222!0%1-bc4n1F4H7X2Q0K0Z0D0%0o650O0J111r1t1v1x0d9.aM1M3j1G0k0-4=0d5Q0F2S0q1i0d1x0Y0d2K0$5-0~0v1/0-290F0S2#0R2K1/0%1g0p5p0d0x000R2-0d200R0@1/4E4t3w1@1#1%1)bt7x5P80340Vb9040W1IbN040#1/1|0hb@0db/0p0r0o2db!1.0=azaVb{bI1R0D0Db%2n4=0=0Sb_0S0G15b=0=4s17b~cF0h0v5-2K0d0%0v0p0q0N51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0W060e371ib/0%bR0F0$2d0Kc)b.0dbH0dcAbS3.0RdS2N0N0$0r5p2QbU1/b bTb!0%0n0n9)0=1v000XcE0=0v3za?0=0q0`1w0=2N0^0d0K0P2zdR1Zb b_cEdR0%0d2 dZ0$0,0F4=ckbMbsdDeeaBb!0x1i0rct1/4sejcK0hc+b|1g0:d}eAcE0R0z0dcqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0hel1P1Kcned4y5H0c2Qe70!b 0x0ReKbo1.csb,e2e,0qe.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0(b_c+cU4!0$4=c+dSb@2#bI0r0_1x0b0dbXeD1$0S1/dS6v0KdVcX0ddYd!2P2n0re$cl13bd0-6A0S04.

###(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

.128013,è Ow5e(8CR0pkoic6S1vqd:xy24fln-]93m=)rhê[us;b/.àt_gLéaP+7050x0h0Y0%0q0E0S0d0r0E0%0S0S0L010Y0q0n010406050S0R0K0K0%0N0A040t0p0E0R0~0p0F0d020%0K0n0T0d0l0h180N0w0R0h0S050V1517191b130n041z1G051J0V1J1L1G130x0q0v0?0^0`0|0O0q0!0O0E1Z0O0Y11050.0U0E0h1U0_0{011Y1!1$1!0Y1,1.1*0Y0U0p0x1b1+0N1H0Y0O0?1e0S0n0%0F0|0B011:1W010D0:0h0F1m0h1*2b2d2i1=2l1.2o0K2q040a0d0(0N0p0n0p0S0q1h1j0,290N0N0h0r2L1z2s0F1H0V272X0Y2524260x2u0|1$0F2n2I1*1R1T0@1;2+0q2-0F211S1*0n2Q1H2V2X32142c1j2?2j2{0N180E110d0u2U3612352t381=3a3c3e0B3h2d3j2V2*013o0%3d040d0J3s2W133v3m0|3y3A0d0C3E3u363w3K3e0g3O3G3Q3I3x0p3b3z3e0s3V3k371V3n3!3p3B0*3)3H3,3J3.3$3B0j3=3X3@3Z3#3L0I3}3l3 3S040u0m443+2@403/0u3g1A3i1I301z2;2!0x2(3w0r212A0+1S1H2 0h314j4i3t054s0,4A454d0o110,0D3O3*3w0f3e4O3?4d0F0D110E0n0;0S0r4T3~4d10040i4(4I39110Y0h0z4=0Z0%4.4c2j4+0b3O0d4P3Y0F4;4?4^0U4{3w4+0M0y3V0d5f514U4:040E1i0!1w0R0N1y4C2W5h4)2j0p110L50523 4+0Q593Y0K0q114a5s3B5B4J110D3!5A5i3n110Z5S5v1=0p4R042_5X4/3n0U110N2d0!0h5F5C114-5L5N395+5k2n5;4*5?5~5j4=4@0h4_611=5b5(4|5Z110)6a3w5H114h345T0|5b0H5e5g5_1=4K045Q0N6f534;0/0E1.0Z585L5u5)0|5!115%6F6r3J5{5-0F5/676m605^6l016h486T014~6x465{2x6#4+5@6k5Y3J55646D6,110M6(4d5x046e6M6X6Z6j4j6X5b5d5L065g7a6G6b6;044=1n6{5w5y7i68115E6W6:6Y5I045K327c3w6t6v7l7e5W707q6J5$0F7A3x6P5.5:7p6H6$6V6/7O0F6*5}7N7d7P4,6#547f56654`7W5a6_7I6}6 7v6N7r6i6^040M6o787b6q6X7y5R7D7S6z0:6C7)7:6X7F6L877q7T5,7L7@6.747q727@4 817X8d5|7H7*3Y6-7!6=4^868i7O698n3w7.7I8k8s5=7^7732797|7b7;6t0q4N8C6y7$6?8y4D757n8v7f6A857-110G8F7s738Y7q4+7`8b7O6}0L5z8T468w656E7R7X5D8#0.848~8)048+8{4d8G907+040H8K3i8M8N8N7;7#7g0n7@7o9d8U946B7(7@8=3i7w3Y8^8,7?9a7j6~7I7#5l6R5o5q9q938%9w9F6c989D6!8H5 9f6p9k5f8P110h0;7M9s8I9h3t9j9#7a9m557h9X4}8!9_5U8$95669|6U9Z9S6I7ka47J11180z8g931s9pa17Y9r8z8o839va08?7X6}99ao6g8-9x8mas8U9K5n0h5p5r9,9Yai8/829~am8X2W7;8;6`7{9l6X9J5m9MaD9z7;9Ca79nae9!9A3 6t2Q0Y5p8rax8|5kaUaB9Nag92ag8p6+a^7Qaj3R8}ana 8t6_9y9/1z4F4z4kba0V4n1z0Y4pbf2$2Y20222!0%1-bc4n1F4H7X2Q0K0Z0D0%0o650O0J111r1t1v1x0d9.aM1M3j1G0k0-4=0d5Q0F2S0q1i0d1x0Y0d2K0$5-0~0v1/0-290F0S2#0R2K1/0%1g0p5p0d0x000R2-0d200R0@1/4E4t3w1@1#1%1)bt7x5P80340Vb9040W1IbN040#1/1|0hb@0db/0p0r0o2db!1.0=azaVb{bI1R0D0Db%2n4=0=0Sb_0S0G15b=0=4s17b~cF0h0v5-2K0d0%0v0p0q0N51b9c71%1_1(2r8jaua78Ea!7Ua.b38I8haHak8V8x7@aPcgci299K2-0=b,c52N3Yc8c:cb7;9caX886d9Ic{aca`b18 c}9Yd54Bd71_da0W060e371ib/0%bR0F0$2d0Kc)b.0dbH0dcAbS3.0RdS2N0N0$0r5p2QbU1/b bTb!0%0n0n9)0=1v000XcE0=0v3za?0=0q0`1w0=2N0^0d0K0P2zdR1Zb b_cEdR0%0d2 dZ0$0,0F4=ckbMbsdDeeaBb!0x1i0rct1/4sejcK0hc+b|1g0:d}eAcE0R0z0dcqb@eJ2Nddew3 dgcac=7Odk4Dch4t3Bdz0hel1P1Kcned4y5H0c2Qe70!b 0x0ReKbo1.csb,e2e,0qe.ew1e1ib b ex0~2n2`b!dQ0,0=ePc.1^eTcc5G7s7udxeZe%cm0(b_c+cU4!0$4=c+dSb@2#bI0r0_1x0b0dbXeD1$0S1/dS6v0KdVcX0ddYd!2P2n0re$cl13bd0-6A0S04.