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)
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 : 5/5

.128013lS]et-d5f18umaèg,_/R=in{ 6)yàqPhcïD[(bEsx.p;r4j'C90"ov+w7Q3?Ok:é }2030b08090i0q050I0*0B050i0I0I0p0U090q0L0U020t030I0g0h0h0i0N0w02060V050g100V0r0*000i0h0L0M0*0o081a0N0y0g080I030n17191b1d150L02031I1B1L0n1I150b0q0W0^0`0|0~0A0q0k0A051Z0A0913030:0G05081U0{0}0U1Y1!1$1!091+1-1)090N1J090A0^1g0I0L0i0r0~0,0U1/1W0U0d0=080r1o081)25272c1;2f1-2i0h2k02040*0z0N0V0L0V0I0q1j1l0.230N0N080B2F1B2m0r1J0n212R1~201 1*0b2o0~1$0r2h2C1)1R1T0_1:2#0q2%0r0V2*1)0L2K1J2P2R2{16261l2,2d2;0N1a05130*0e2O2 142~2n311;3335370,3a273c2P2!0U3h0i36020*0#3l2Q153o3f0~3r3t0*0O3x3n2 3p3D370c3H3z3J3B3q0V343s370u3O3d301V3g3T3i3u0Z3Y3A3#3C3%3V3u0f3*3Q3,3S3U3E0S3=3e3@3L020e0T3|3!2-3^3'0e391C3b3P3}453 0e3k4a3m4c44323.3t0e3w4i3y3Z3K4n130e3G4r3I4d4m3_4w3N4z1M2_1B2*2U0b202Z3R0B2=2u0-1S1J2^082`3b3H034Q0.4Y4B1;0'130.0d3H0*4t3R0r0d13050L0?0I0B4!3+4512020F4}3?4e1309080J570m0i534(0~500l4.4:3~56585a0G5d4l1;500v0(3O0*5w4/4~2d4*024,5i5z3g4?024^4`0B0m2K4|4G5F5f13525P5432560;051-5b5p3p5g5E5V3g5X0=5!5o5U5e0U5s5u4z0t5x5_5y5)0~5B0q4-4z5{5:0r5+5Z085#615j450V130p0p5(5:0h0q1342695Q0U0V0Y133T6g5q3C655-6t3p6c026e6y3R6i6k5$3R505?2{5^5`6N6a5A132K090g0N0r6D3@6F026l6L6N5w6P4)135 6X4 5S6H5k020:5,675c5/6u5;135h6m5|3q6w675.2}6n5s6,2d6p132;09771;79022/7d6v5I1k0k1y6U1A6_5%136K4b6%5`6(5}6*602{626`646;5m6@6/6-020E7I5W6;5Y5!6^7B7x6o130a7i0U6Z49746 50077X6A6C6~635l59727M5r137L7q4;710m733b7C6z7V7X7Z7:5R02077t4j7v7v7T7E057l7n0N7p7#5:500E5T8h7D7_7R4Z756|7X7E6=667`826{020v7'7+6`7)806j407(130X8t4@4_0|5L5N8y508l8q6 8u7P7H8D7~027W8!6E8H7!8V8i8s8'6:8v6x8.6b7 8=2d817@3@765@885x7T5B080?088S7s5v8 7w6n8b8d087o967K8U3m8a8o9g6}7S9b7_7{9j8r8A8C9o6 8F8^3g0G131a0J9g9i3y99889k5I8O4{5M2L9F8y8X6?689w5:6A8%9V6`8`8m7r029n7|9K8:7/8{7J0v9(3m7}7^9L5K9O5O9$6I6.9-7N9+9U8+6`5'9z7ja09r2Q9=3@9X8G4w9g0v989I6'9tag8~6%916R0/6U6Wa5707k0r7m9e8f9g8k9R9l9~7;9'8M7O9Ta84'a3138B3O6Maj8W4@9d9fat9y9Z9%0s0+ahaa455B6SaraH5J8P9_9QaE3C9B5I2ha/9{8/7Ga19s7$aN9:a98aa=2ra^a23K7-5nafal6L1B4$4X4Hbf0n4K1B094Mbk2X2S0i1,bh4K1HaL3p2K0h0m0d0i0'670A0#131t1v1x1z0*862Q1M3c1I0D270@0`0*0d1k2M0q1k0*2^2/0B113s1.b!4Q192h0B1.260N0^0N0)08b=1-0*1RbY1k2i0q2K4/beavaxaVc40*2/2E0qb)2t0r090*0W0q2H1x0qb#b_2t1`0N0ib|1.031u020h0)0h0V0C0Ib_1Bcw0K0t0%1l0`0rb/0*2h172E1.1-0@0i0L0L930@b@0B7o5 0@2h0*cDct1a0r0b27cgbJ66cO0IcgbU8caw8ect0*bU4_0gbT9dc)0Vd10acQ5723190g2%c)cm050Qb+1k2D0b0j2K0t09d557bTbK1-cqbK2H0B0A0ibJ0*577.bLc34R9@a-5N0F2r0FdD5a0i9/c~2hdNa{0G0valc80$bObu0R0Vb-c~cs0Id50I0abWcM2Fc?cgc!c$0W080lc905d=0*0Gb!2H0b0)0G1ib_b#1b0*dc0^0{c}0G0{08cH0R0Q1zcg0qb'dSec0@d5c~0Qeb0.0@0.0g0JdC7G0@dd4Qcf0q2hcg0i0gc#301b0i2Mdmeh0*bR0r0@cN0B0{d{b!2K0r0W0VeHb|c12L57cecg4#4R3p1?1#1%1(bv8(6G4G0nc40Kd#1K02cJch0)0N5 e)cP0gcR0*dBb{eYcU0*0)090)dCcr2Efles2;0r0K2xd5b=b/bUb!c*0.c,2H2Dd)1Ufle:4%dN8Y5bd{a7dYdH0t0rekc@e80@2^0)cDcf1.c.eVepb}2Fc0c2fI4Xc`c6aze~dHf01ObP1ecm0BfTc^1.fgd{0=bVeKcg1~0;57fw0/d9b,b;0;d+1l5?1P030g053c1$02fEcTct6VeH8feccreQ2KeWdjcjf6fYd4cfc90.eGbJ0Ie!1l260|1.eKeAeYgv09eRfWc!0)gG09c'c^dh1l0i0Pdqcubee=1%1^1'2l6 9#4Zf;4%0*eK0*b@17050:cg0M1Bgm15gmgobKgRePgTgxe*0d0deRcfgKfi6T1RcSdw9egQedfXb'0IgCb;et0)fr0B0)ftf44_ePf#bSf'enf)0;c2b{g|gjg epd00@0kcrc-f?h31Bgjf^0!1yd}dBd+2EepfgcOe%0q0I0i0k0)d{bU0Wb)6Ud~0q19gXcce-eIc)dp0B0'b^b|hFb{f(bZ0rf*g*dHf.8e7pe f11I0H2Gb_0rgsc~eH0ghhe$e'e)h?h^b=feg$cheHgE0b0Q2/hs2Kb=f$dse*b~ibhJb*0g0^93b{clhig6b|0)0P0xb#g|eIehf1bi0/5Y0I02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013lS]et-d5f18umaèg,_/R=in{ 6)yàqPhcïD[(bEsx.p;r4j'C90"ov+w7Q3?Ok:é }2030b08090i0q050I0*0B050i0I0I0p0U090q0L0U020t030I0g0h0h0i0N0w02060V050g100V0r0*000i0h0L0M0*0o081a0N0y0g080I030n17191b1d150L02031I1B1L0n1I150b0q0W0^0`0|0~0A0q0k0A051Z0A0913030:0G05081U0{0}0U1Y1!1$1!091+1-1)090N1J090A0^1g0I0L0i0r0~0,0U1/1W0U0d0=080r1o081)25272c1;2f1-2i0h2k02040*0z0N0V0L0V0I0q1j1l0.230N0N080B2F1B2m0r1J0n212R1~201 1*0b2o0~1$0r2h2C1)1R1T0_1:2#0q2%0r0V2*1)0L2K1J2P2R2{16261l2,2d2;0N1a05130*0e2O2 142~2n311;3335370,3a273c2P2!0U3h0i36020*0#3l2Q153o3f0~3r3t0*0O3x3n2 3p3D370c3H3z3J3B3q0V343s370u3O3d301V3g3T3i3u0Z3Y3A3#3C3%3V3u0f3*3Q3,3S3U3E0S3=3e3@3L020e0T3|3!2-3^3'0e391C3b3P3}453 0e3k4a3m4c44323.3t0e3w4i3y3Z3K4n130e3G4r3I4d4m3_4w3N4z1M2_1B2*2U0b202Z3R0B2=2u0-1S1J2^082`3b3H034Q0.4Y4B1;0'130.0d3H0*4t3R0r0d13050L0?0I0B4!3+4512020F4}3?4e1309080J570m0i534(0~500l4.4:3~56585a0G5d4l1;500v0(3O0*5w4/4~2d4*024,5i5z3g4?024^4`0B0m2K4|4G5F5f13525P5432560;051-5b5p3p5g5E5V3g5X0=5!5o5U5e0U5s5u4z0t5x5_5y5)0~5B0q4-4z5{5:0r5+5Z085#615j450V130p0p5(5:0h0q1342695Q0U0V0Y133T6g5q3C655-6t3p6c026e6y3R6i6k5$3R505?2{5^5`6N6a5A132K090g0N0r6D3@6F026l6L6N5w6P4)135 6X4 5S6H5k020:5,675c5/6u5;135h6m5|3q6w675.2}6n5s6,2d6p132;09771;79022/7d6v5I1k0k1y6U1A6_5%136K4b6%5`6(5}6*602{626`646;5m6@6/6-020E7I5W6;5Y5!6^7B7x6o130a7i0U6Z49746 50077X6A6C6~635l59727M5r137L7q4;710m733b7C6z7V7X7Z7:5R02077t4j7v7v7T7E057l7n0N7p7#5:500E5T8h7D7_7R4Z756|7X7E6=667`826{020v7'7+6`7)806j407(130X8t4@4_0|5L5N8y508l8q6 8u7P7H8D7~027W8!6E8H7!8V8i8s8'6:8v6x8.6b7 8=2d817@3@765@885x7T5B080?088S7s5v8 7w6n8b8d087o967K8U3m8a8o9g6}7S9b7_7{9j8r8A8C9o6 8F8^3g0G131a0J9g9i3y99889k5I8O4{5M2L9F8y8X6?689w5:6A8%9V6`8`8m7r029n7|9K8:7/8{7J0v9(3m7}7^9L5K9O5O9$6I6.9-7N9+9U8+6`5'9z7ja09r2Q9=3@9X8G4w9g0v989I6'9tag8~6%916R0/6U6Wa5707k0r7m9e8f9g8k9R9l9~7;9'8M7O9Ta84'a3138B3O6Maj8W4@9d9fat9y9Z9%0s0+ahaa455B6SaraH5J8P9_9QaE3C9B5I2ha/9{8/7Ga19s7$aN9:a98aa=2ra^a23K7-5nafal6L1B4$4X4Hbf0n4K1B094Mbk2X2S0i1,bh4K1HaL3p2K0h0m0d0i0'670A0#131t1v1x1z0*862Q1M3c1I0D270@0`0*0d1k2M0q1k0*2^2/0B113s1.b!4Q192h0B1.260N0^0N0)08b=1-0*1RbY1k2i0q2K4/beavaxaVc40*2/2E0qb)2t0r090*0W0q2H1x0qb#b_2t1`0N0ib|1.031u020h0)0h0V0C0Ib_1Bcw0K0t0%1l0`0rb/0*2h172E1.1-0@0i0L0L930@b@0B7o5 0@2h0*cDct1a0r0b27cgbJ66cO0IcgbU8caw8ect0*bU4_0gbT9dc)0Vd10acQ5723190g2%c)cm050Qb+1k2D0b0j2K0t09d557bTbK1-cqbK2H0B0A0ibJ0*577.bLc34R9@a-5N0F2r0FdD5a0i9/c~2hdNa{0G0valc80$bObu0R0Vb-c~cs0Id50I0abWcM2Fc?cgc!c$0W080lc905d=0*0Gb!2H0b0)0G1ib_b#1b0*dc0^0{c}0G0{08cH0R0Q1zcg0qb'dSec0@d5c~0Qeb0.0@0.0g0JdC7G0@dd4Qcf0q2hcg0i0gc#301b0i2Mdmeh0*bR0r0@cN0B0{d{b!2K0r0W0VeHb|c12L57cecg4#4R3p1?1#1%1(bv8(6G4G0nc40Kd#1K02cJch0)0N5 e)cP0gcR0*dBb{eYcU0*0)090)dCcr2Efles2;0r0K2xd5b=b/bUb!c*0.c,2H2Dd)1Ufle:4%dN8Y5bd{a7dYdH0t0rekc@e80@2^0)cDcf1.c.eVepb}2Fc0c2fI4Xc`c6aze~dHf01ObP1ecm0BfTc^1.fgd{0=bVeKcg1~0;57fw0/d9b,b;0;d+1l5?1P030g053c1$02fEcTct6VeH8feccreQ2KeWdjcjf6fYd4cfc90.eGbJ0Ie!1l260|1.eKeAeYgv09eRfWc!0)gG09c'c^dh1l0i0Pdqcubee=1%1^1'2l6 9#4Zf;4%0*eK0*b@17050:cg0M1Bgm15gmgobKgRePgTgxe*0d0deRcfgKfi6T1RcSdw9egQedfXb'0IgCb;et0)fr0B0)ftf44_ePf#bSf'enf)0;c2b{g|gjg epd00@0kcrc-f?h31Bgjf^0!1yd}dBd+2EepfgcOe%0q0I0i0k0)d{bU0Wb)6Ud~0q19gXcce-eIc)dp0B0'b^b|hFb{f(bZ0rf*g*dHf.8e7pe f11I0H2Gb_0rgsc~eH0ghhe$e'e)h?h^b=feg$cheHgE0b0Q2/hs2Kb=f$dse*b~ibhJb*0g0^93b{clhig6b|0)0P0xb#g|eIehf1bi0/5Y0I02.
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)
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 : 5/5

.128013lS]et-d5f18umaèg,_/R=in 6)yàqPhcL[(bsx.p;r4C'90"ov+w73êOk:é 2030b08090i0q050F0$0A050i0F0F0p0Q090q0I0Q020s030F0g0h0h0i0K0v02060R050g0`0R0r0$000i0h0I0J0$0o08140K0x0g080F030n111315170 0I02031C1v1F0n1C0 0b0q0S0/0;0?0^0z0q0k0z051T0z090}030*0E05081O0=0@0Q1S1U1W1U091$1'1!090K1D090z0/1a0F0I0i0r0^0%0Q1)1Q0Q0d0,080r1i081!1 21261+291'2c0h2e02040$0y0K0R0I0R0F0q1d1f0(1}0K0K080A2z1v2g0r1D0n1{2L1^1`1_1#0b2i0^1W0r2b2w1!1L1N0:1*2V0q2X0r0R2#1!0I2E1D2J2L2=10201f2%272+0K14050}0$0e2I2_0~2^2h2{1+2}2 310%3421362J2U0Q3b0i30020$0W3f2K0 3i390^3l3n0$0L3r3h2_3j3x310c3B3t3D3v3k0R2~3m310t3I372`1P3a3N3c3o0V3S3u3V3w3X3P3o0f3#3K3%3M3O3y0O3,383.3F020e0P3?3U2'3/3Y0e331w351G2:1v2#2O0b1`2T3L0A2,2o0'1M1D2/082;45443g034f0(4n3@3 0Z0}0(0d3B0$3T3E0d0}050I0-0F0A3B4D3L0|020D4M3$3 0r0}09080G4X0m0i4S3-3 4P0l4B4N3^4W4Y4!0E4%4v274P0u0!3I0$4|4C4T2|4G1e0k1s0g0K1u4p2K4~4'270R0}0p4+4 1+4P0C4=3~270h0q0}3|583o4,4w0}0d3N5g5b3a0}0m5z4?1+0R0U0}2)5E5m3a0E0}0K210k085l3j4P4R5s5u2|5O022l5U4O0}5X2@5h3w4.4Z084#5'3.4^5L3j5d020T5^3L5o0}435+5A0^4^074{4}5Z1+4x025x0K5}4-020*0,1'0m4;5s5a5F0^5H5J0r6f4U5#5Q0r5S5=4(5)6A5n5p3`6D5i0}4*6n693w5#5%5Y5,0Q5W6H5-6h4/5:6m626p6S0}0u6u5c0}5|6L6R5 6G6Q636$024_674}686R4V6W1j6(5G5e6 640}5k6:6#6.5r2=6o5M0^6b6d723k5C7g6r025K6,6;0r6w5R5T767c6=5*456{6O2b6U7v7B6|4X5/5;7t5V6%7j6*7g6.617x6;656^6_7b3j7e5y7n6#7E0+056k4$7Z7u7k7m7a6M3k7q6y7s6!7u6T7I5~6F7P4q6R4)7g7p4G7A7_5?6C844U5.4!7(7?7J6?7L5{7N7{7B4^4`5s0s7U8o7V3L6b0q4A7)3E895:8b7Q6#5j7D4W7$7'8f0a8h608j0}668v3L5`0p5f8O6g7F4:8L02758c3L7#6j6Y8H8J6/8!8502078l2=8n8p8=7.7E1o0I8X8Z8A7u8$7%8y8X8N7-6R8Q8)7|597.5`6+947o516y54568{8D6h8F918T3 5`8I9o6E8K874@8M7T8?6R6b080-7=8}8d8/358;8=8o8@4.6~9v6I8Y9k6i907H8+6B8-8f8S9d7!5#140G8X7w7}9e6}8`9P739R9/7h9l8%9V358q3.9q97926K9#8~9f530855579W9w9;a85B9@9U8z9+8B8M6'8m9z9,05529ha79`9a719sac4X9O8:6_7.6b2E09556tau6Van9ga59i9=8C9=815$83ab9:9*2K9M6W7GafaV7~6%939I1v4s4m46a*0n491v094ba/2R2M0i1%a,491B4u7u2E0h0m0d0i0Z5:0z0W0}1n1p1r1t0$9H4q1I361C0M0)4X0$5x0r2G0q1e0$1t090$2y0#5Q0`0S1(0)1}0r0F1^0g2y1(0i1c0R550$0b0N0g2X0$0EbM0:1(4r4g3j1-1V1X1Za}7W5w7Y2@0na)020H1Gbh020B1(1=08bK0$bF0R0A0Z21bu1'0.aIa4a6bObc1L0d0dbx2b4X0.0FbM0F0a11bI0.4f13bRc9080S5Q2y0$0i0S0R0q0K4Ca)b!1X1/1Y2f6;7O8f9car7y82aFaS7CaO8x9_ag7@7K5Yb-4g3o4faI2X0.bCbY2B3Lb#cGb'7.cKaG0Q9b807zcQ9F5(4Q9S6X6l8Xajb,b.0$1/c(0H0s0Y2`1ebF0ibl0r0#210hczbE0$bbd6bc6d0h0gc3c80$0K0#0A552Ebo1(bSbnbu0i0I0I9C0.1r0N0wc80.0S3maK0.0q0?1s0.2B0;0$0h0X2nd61TbSbMdvd!2/dy0#0(0r4Xb:bga|db0$dJ1cbO1e0Ab|1(4fd=ce08cBbP1c0,dVe6c80g0G0$b_bKef2Bc+e23.c.b%cI778icZd5d708d@1J1Eb?0id{a 0q0j2Ed(0kbS0b0gega^1'b{bCd-eDeFe21a1ebSbSe30`2b2*budo0(0.elcE1.epb(7`5q4Mc!4texb=0ybMcBco4I0#4XcBdubK1^bc0A0=1t0l0$bre91W0F1(dudrdtcrdwdydA2b0Aewb;0 a-0)7$0F02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013lS]et-d5f18umaèg,_/R=in 6)yàqPhcL[(bsx.p;r4C'90"ov+w73êOk:é 2030b08090i0q050F0$0A050i0F0F0p0Q090q0I0Q020s030F0g0h0h0i0K0v02060R050g0`0R0r0$000i0h0I0J0$0o08140K0x0g080F030n111315170 0I02031C1v1F0n1C0 0b0q0S0/0;0?0^0z0q0k0z051T0z090}030*0E05081O0=0@0Q1S1U1W1U091$1'1!090K1D090z0/1a0F0I0i0r0^0%0Q1)1Q0Q0d0,080r1i081!1 21261+291'2c0h2e02040$0y0K0R0I0R0F0q1d1f0(1}0K0K080A2z1v2g0r1D0n1{2L1^1`1_1#0b2i0^1W0r2b2w1!1L1N0:1*2V0q2X0r0R2#1!0I2E1D2J2L2=10201f2%272+0K14050}0$0e2I2_0~2^2h2{1+2}2 310%3421362J2U0Q3b0i30020$0W3f2K0 3i390^3l3n0$0L3r3h2_3j3x310c3B3t3D3v3k0R2~3m310t3I372`1P3a3N3c3o0V3S3u3V3w3X3P3o0f3#3K3%3M3O3y0O3,383.3F020e0P3?3U2'3/3Y0e331w351G2:1v2#2O0b1`2T3L0A2,2o0'1M1D2/082;45443g034f0(4n3@3 0Z0}0(0d3B0$3T3E0d0}050I0-0F0A3B4D3L0|020D4M3$3 0r0}09080G4X0m0i4S3-3 4P0l4B4N3^4W4Y4!0E4%4v274P0u0!3I0$4|4C4T2|4G1e0k1s0g0K1u4p2K4~4'270R0}0p4+4 1+4P0C4=3~270h0q0}3|583o4,4w0}0d3N5g5b3a0}0m5z4?1+0R0U0}2)5E5m3a0E0}0K210k085l3j4P4R5s5u2|5O022l5U4O0}5X2@5h3w4.4Z084#5'3.4^5L3j5d020T5^3L5o0}435+5A0^4^074{4}5Z1+4x025x0K5}4-020*0,1'0m4;5s5a5F0^5H5J0r6f4U5#5Q0r5S5=4(5)6A5n5p3`6D5i0}4*6n693w5#5%5Y5,0Q5W6H5-6h4/5:6m626p6S0}0u6u5c0}5|6L6R5 6G6Q636$024_674}686R4V6W1j6(5G5e6 640}5k6:6#6.5r2=6o5M0^6b6d723k5C7g6r025K6,6;0r6w5R5T767c6=5*456{6O2b6U7v7B6|4X5/5;7t5V6%7j6*7g6.617x6;656^6_7b3j7e5y7n6#7E0+056k4$7Z7u7k7m7a6M3k7q6y7s6!7u6T7I5~6F7P4q6R4)7g7p4G7A7_5?6C844U5.4!7(7?7J6?7L5{7N7{7B4^4`5s0s7U8o7V3L6b0q4A7)3E895:8b7Q6#5j7D4W7$7'8f0a8h608j0}668v3L5`0p5f8O6g7F4:8L02758c3L7#6j6Y8H8J6/8!8502078l2=8n8p8=7.7E1o0I8X8Z8A7u8$7%8y8X8N7-6R8Q8)7|597.5`6+947o516y54568{8D6h8F918T3 5`8I9o6E8K874@8M7T8?6R6b080-7=8}8d8/358;8=8o8@4.6~9v6I8Y9k6i907H8+6B8-8f8S9d7!5#140G8X7w7}9e6}8`9P739R9/7h9l8%9V358q3.9q97926K9#8~9f530855579W9w9;a85B9@9U8z9+8B8M6'8m9z9,05529ha79`9a719sac4X9O8:6_7.6b2E09556tau6Van9ga59i9=8C9=815$83ab9:9*2K9M6W7GafaV7~6%939I1v4s4m46a*0n491v094ba/2R2M0i1%a,491B4u7u2E0h0m0d0i0Z5:0z0W0}1n1p1r1t0$9H4q1I361C0M0)4X0$5x0r2G0q1e0$1t090$2y0#5Q0`0S1(0)1}0r0F1^0g2y1(0i1c0R550$0b0N0g2X0$0EbM0:1(4r4g3j1-1V1X1Za}7W5w7Y2@0na)020H1Gbh020B1(1=08bK0$bF0R0A0Z21bu1'0.aIa4a6bObc1L0d0dbx2b4X0.0FbM0F0a11bI0.4f13bRc9080S5Q2y0$0i0S0R0q0K4Ca)b!1X1/1Y2f6;7O8f9car7y82aFaS7CaO8x9_ag7@7K5Yb-4g3o4faI2X0.bCbY2B3Lb#cGb'7.cKaG0Q9b807zcQ9F5(4Q9S6X6l8Xajb,b.0$1/c(0H0s0Y2`1ebF0ibl0r0#210hczbE0$bbd6bc6d0h0gc3c80$0K0#0A552Ebo1(bSbnbu0i0I0I9C0.1r0N0wc80.0S3maK0.0q0?1s0.2B0;0$0h0X2nd61TbSbMdvd!2/dy0#0(0r4Xb:bga|db0$dJ1cbO1e0Ab|1(4fd=ce08cBbP1c0,dVe6c80g0G0$b_bKef2Bc+e23.c.b%cI778icZd5d708d@1J1Eb?0id{a 0q0j2Ed(0kbS0b0gega^1'b{bCd-eDeFe21a1ebSbSe30`2b2*budo0(0.elcE1.epb(7`5q4Mc!4texb=0ybMcBco4I0#4XcBdubK1^bc0A0=1t0l0$bre91W0F1(dudrdtcrdwdydA2b0Aewb;0 a-0)7$0F02.