moyen
Diverses files (POO)
Un exercice : deux versions
Cet exercice sur les files est proposé en deux versions :
On s'intéresse sur cette page au type abstrait de données « File » que l'on représente à l'aide d'une classe File dont on fournit le code ci-dessous.
La classe File
from collections import deque
class File :
def __init__ ( self ):
"""Initialise une file vide"""
self . valeurs = deque ()
def est_vide ( self ):
"""Renvoie le booléen indiquant si la file est vide"""
return len ( self . valeurs ) == 0
def enfile ( self , x ):
"""Ajoute x à la queue de la file"""
self . valeurs . append ( x )
def defile ( self ):
"""
Retire et renvoie la valeur à la tête de la file
Génère une erreur si la file est vide
"""
if self . est_vide ():
raise ValueError ( "La file est vide" )
return self . valeurs . popleft ()
def __repr__ ( self ):
"""Affiche la file, en indiquant la tête"""
return f " { ' | ' . join ( map ( str , list ( self . valeurs )[:: - 1 ])) } <- tête"
def __eq__ ( self , autre ):
"""Détermine si cette file et l'autre sont égales (mêmes valeurs, dans le même ordre)"""
return self . valeurs == autre . valeurs
Cette classe possède deux méthodes spéciale __repr__ et __eq__ qui permettent :
d'afficher le contenu de la file (__repr__ ) ;
de tester l'égalité entre la file étudiée et une autre file passée en paramètre (__eq__ ).
Les lignes ci-dessous présentent un exemple d'utilisation. On prendra soin, dans les différents exercices, de n'utiliser que les méthodes présentées ci-dessous .
Utilisation
>>> f = File () # création d'une file vide
>>> f . est_vide () # la file est-elle vide ? -> Oui
True
>>> f . enfile ( 0 ) # enfile 0 dans la file
>>> f . est_vide () # la file est-elle vide ? -> Non
False
>>> f . enfile ( 1 ) # enfile 0 dans la file
>>> f # affichage du contenu de p
1 | 0 <- tête
>>> f . defile () # défile une valeur
0
>>> f
1 <- tête
>>> g = file ()
>>> g . enfile ( 1 )
>>> g
1 <- tête
>>> f == g # les files f et g sont-elles égales ? -> Non
False
Les exercices ci-dessous sont indépendants. Ils sont néanmoins présentés dans un certain ordre permettant d'aborder successivement plusieurs techniques.
Jouons le jeu !
Ces exercices visent à utiliser certaines techniques classiques liées aux files. Il est donc demandé de les traiter en se limitant à l'utilisation des méthodes la classe File .
Il est en particulier interdit d'accéder directement à l'attribut valeurs .
1. Calculer la taille d'une file
Écrire la fonction taille qui prend en paramètre une file et renvoie son nombre d'éléments.
A l'issue du traitement, la file doit avoir retrouvé son état initial.
>>> f = File ()
>>> taille ( f )
0
>>> f . enfile ( "a" )
>>> f . enfile ( "b" )
>>> taille ( f )
2
Aide
On pourra utiliser un compteur et une file annexe.
Version vide Version à trous
.128013:ag)1ikn9/S=vFmsuhb.84y7ex6+2odt c0(wr5_P3plf050F0z0G0c0g0S0q0H0I0S0c0q0q0m010G0g0R010406050q0r0p0p0c0M0x040l0E0S0r0.0E0i050k0^0`0|0~0?0R04171e051h0k1h1j1e0?0F0g0n0$0(0*0,0s0g0d0s0S1x0s0G0;050X0t0S0z1s0)0+011w1y1A1y0G1G1I1E0G0t0E0F0~1F0M1f0G0s0$110q0R0c0i0,0D011K1u010T0Z0z0i0c0p0z1E1,1.1?1M1_1I1|1~0;0a0H0P0M0E0R0E0q0g140i0H0V1*0M0M0z0I2j17210i1f0k1(2w0G1$1#1%0F230,1A0i1{2g1E1p1r0%1L2G0g2I0i1Y1q1E0R2p1f2u2w2!0@1-2k2O1@2T0M0{0S0;0f2t2(0=2%222*1M2,2.0;0D2=1.2@2u2F012|0c2/040Q302v0?332`0,36380w3b322(343h0;0N3k3d3m3f350E2-370;0B3r2^2)1t2{3w2}040y3B3e3E3g3G3y040v3K3t3M3v3x380j3k1g2Y172M2z0F2D340I1Y1 1f3%1i3#2$182?053,0V2Z3T2P010h0;0V0T3Z3L3~0L0;0H443}2+0T0;0X0Z1I4a2_3U0:040K4i3D3~0i0;433@313C344l0e0b3r0H4C49452+0;1.2I0A0z3k4E4b1M0E0;0m4M4w3u4r040o1`4o4x0;0K0e4B4D4U3U4W2p0^0S0X0G4T4F4P4R4?4O0,0p0g0;0J4)4C4+3~40040L1w4h4u2v4N4j3~0E47042T4=5a045c4p4G044t2$4@0,4Q040u4!4V0;0z0q0G0O0n0g0V5x4k4$4z514D525s350;4.0r4:0c5j2!5m345u0C4S5k5X3u4}2:5L5M535o4I0z4K5H5e0;5w5k5-2{5z0i254L5_5O4l4n604{5P5p5=1@5u5^5r654W424Z645d1@620e4(5k065,5O55576g5W5`5t5g5i4`6i5{045/5;6h5n4^5v686B5A5C5E5G6F4#4m5K6n5M6p6d4s6J5t5@6Y661{5~6#626#4W6D5 6c6A6Z6I6P5y046f596/6G0,6k6m2!6o4*6q5Q0W0r0M165$6v665R5T5V2?0?0k3`0z2w2X7j3$1q3(2z2B2x1X1Z2z0c1H7m0k3%7g0V4f0!04.
.128013:ag)1ikn9/S=vFmsuhb.84y7ex6+2odt c0(wr5_P3plf050F0z0G0c0g0S0q0H0I0S0c0q0q0m010G0g0R010406050q0r0p0p0c0M0x040l0E0S0r0.0E0i050k0^0`0|0~0?0R04171e051h0k1h1j1e0?0F0g0n0$0(0*0,0s0g0d0s0S1x0s0G0;050X0t0S0z1s0)0+011w1y1A1y0G1G1I1E0G0t0E0F0~1F0M1f0G0s0$110q0R0c0i0,0D011K1u010T0Z0z0i0c0p0z1E1,1.1?1M1_1I1|1~0;0a0H0P0M0E0R0E0q0g140i0H0V1*0M0M0z0I2j17210i1f0k1(2w0G1$1#1%0F230,1A0i1{2g1E1p1r0%1L2G0g2I0i1Y1q1E0R2p1f2u2w2!0@1-2k2O1@2T0M0{0S0;0f2t2(0=2%222*1M2,2.0;0D2=1.2@2u2F012|0c2/040Q302v0?332`0,36380w3b322(343h0;0N3k3d3m3f350E2-370;0B3r2^2)1t2{3w2}040y3B3e3E3g3G3y040v3K3t3M3v3x380j3k1g2Y172M2z0F2D340I1Y1 1f3%1i3#2$182?053,0V2Z3T2P010h0;0V0T3Z3L3~0L0;0H443}2+0T0;0X0Z1I4a2_3U0:040K4i3D3~0i0;433@313C344l0e0b3r0H4C49452+0;1.2I0A0z3k4E4b1M0E0;0m4M4w3u4r040o1`4o4x0;0K0e4B4D4U3U4W2p0^0S0X0G4T4F4P4R4?4O0,0p0g0;0J4)4C4+3~40040L1w4h4u2v4N4j3~0E47042T4=5a045c4p4G044t2$4@0,4Q040u4!4V0;0z0q0G0O0n0g0V5x4k4$4z514D525s350;4.0r4:0c5j2!5m345u0C4S5k5X3u4}2:5L5M535o4I0z4K5H5e0;5w5k5-2{5z0i254L5_5O4l4n604{5P5p5=1@5u5^5r654W424Z645d1@620e4(5k065,5O55576g5W5`5t5g5i4`6i5{045/5;6h5n4^5v686B5A5C5E5G6F4#4m5K6n5M6p6d4s6J5t5@6Y661{5~6#626#4W6D5 6c6A6Z6I6P5y046f596/6G0,6k6m2!6o4*6q5Q0W0r0M165$6v665R5T5V2?0?0k3`0z2w2X7j3$1q3(2z2B2x1X1Z2z0c1H7m0k3%7g0V4f0!04.
2. Échanger les deux valeurs de tête
Écrire la fonction echange qui prend en paramètre une file contenant au moins deux éléments et échange l'ordre des deux valeurs de tête.
La fonction ne renvoie rien, c'est la liste passée en paramètre qui est modifiée à la fin du traitement. On dit qu'elle est modifiée en place .
>>> f = File ()
>>> f . enfile ( "a" )
>>> f . enfile ( "b" )
>>> f . enfile ( "c" )
>>> f
c | b | a <- tête
>>> echange ( f )
>>> f
c | a | b <- tête
Version vide Version à trous
.128013:ag)1ikn9/S=vFmsuhb.84y7ex62odt c0(wr5_P3plf050E0z0F0c0g0R0q0G0H0R0c0q0q0m010F0g0Q010406050q0r0p0p0c0L0x040l0D0R0r0-0D0i050k0@0_0{0}0=0Q04161d051g0k1g1i1d0=0E0g0n0#0%0)0+0s0g0d0s0R1w0s0F0:050W0t0R0z1r0(0*011v1x1z1x0F1F1H1D0F0t0D0E0}1E0L1e0F0s0#100q0Q0c0i0+0C011J1t010S0Y0z0i0c0p0z1D1+1-1=1L1^1H1{1}0:0a0G0O0L0D0Q0D0q0g130i0G0U1)0L0L0z0H2i16200i1e0k1%2v0F1#1!1$0E220+1z0i1`2f1D1o1q0$1K2F0g2H0i1X1p1D0Q2o1e2t2v2Z0?1,2j2N1?2S0L0`0R0:0G0f2s2%0;2$212)1L2+2-2/0C2=1-2@2t2E012|0c2.040G0P302u0=332`0+36380G0w3c322%343i2/0M3m3e3o3g350D2,372/0B3t2^2(1s2{3y2}390y3D3f3G3h3I3A390v3M3v3O3x3z3j0j3U2_3W3q040f0I3m1f2X162L2y0E2C340H1X1~1e3:1h3.2#172?053^0U2Y3V2O010h0:0U0S3,3N470K2/4d462*0S0:2p0s1-0d0z4i3$470/040J4s3F470i0:4c40313E344v0e0b3t0G4M0G4G3w4B040z0R0F0N2;4E2u4O4e1?0D0:0m3m4!4j2{4C4y344%040u4/4Q4a0z244r4Y454t1?4v0J0e4L4N4P3%4m4U0N2 4}4+4 1L4;4)5c564A4.4}5j4$0:4?5m4#4-044b1_4@3W51534}064N5d4z2*0:1-2H0A4|2Z5E4:4(4*5n5t0o5w5r4,0+5z544M5R0+49040K1v1H5Q5s0+0D4g042S0F5,5W355l2#5-014;5q5{5^4R0z0q4V0n0g0U5x4u0:524K5B5D5D5#5_045I0z5K695o4=6n5t1`4{6q5X6b6u6i4D605e5.5p6x4R5v5+5V6B015z5A2Z5C555|4R6z415|5~6E4m0i6t6I5F1L516W4S595b6A6#6v046M2?6O5!6Q5`6T5^6V6!3p6X6Z6,4H6w6|4^6)4V4X703w4I5Z5N3w5%5)5U5M6h5/0:5=5@6J4R6k6m733W6{78574S640N66687r6a4w4J7b6g6@046S4F6U6D7B5G4S6Y7g6_6J6%7N5t7p5L7S6-5}7M7u5k5u4`7R7K5^6L3D0k430z2v2W7=3/1p3;2y2A2w1W1Y2y0c1G7^0k3:0=850V0X0Z04.
.128013:ag)1ikn9/S=vFmsuhb.84y7ex62odt c0(wr5_P3plf050E0z0F0c0g0R0q0G0H0R0c0q0q0m010F0g0Q010406050q0r0p0p0c0L0x040l0D0R0r0-0D0i050k0@0_0{0}0=0Q04161d051g0k1g1i1d0=0E0g0n0#0%0)0+0s0g0d0s0R1w0s0F0:050W0t0R0z1r0(0*011v1x1z1x0F1F1H1D0F0t0D0E0}1E0L1e0F0s0#100q0Q0c0i0+0C011J1t010S0Y0z0i0c0p0z1D1+1-1=1L1^1H1{1}0:0a0G0O0L0D0Q0D0q0g130i0G0U1)0L0L0z0H2i16200i1e0k1%2v0F1#1!1$0E220+1z0i1`2f1D1o1q0$1K2F0g2H0i1X1p1D0Q2o1e2t2v2Z0?1,2j2N1?2S0L0`0R0:0G0f2s2%0;2$212)1L2+2-2/0C2=1-2@2t2E012|0c2.040G0P302u0=332`0+36380G0w3c322%343i2/0M3m3e3o3g350D2,372/0B3t2^2(1s2{3y2}390y3D3f3G3h3I3A390v3M3v3O3x3z3j0j3U2_3W3q040f0I3m1f2X162L2y0E2C340H1X1~1e3:1h3.2#172?053^0U2Y3V2O010h0:0U0S3,3N470K2/4d462*0S0:2p0s1-0d0z4i3$470/040J4s3F470i0:4c40313E344v0e0b3t0G4M0G4G3w4B040z0R0F0N2;4E2u4O4e1?0D0:0m3m4!4j2{4C4y344%040u4/4Q4a0z244r4Y454t1?4v0J0e4L4N4P3%4m4U0N2 4}4+4 1L4;4)5c564A4.4}5j4$0:4?5m4#4-044b1_4@3W51534}064N5d4z2*0:1-2H0A4|2Z5E4:4(4*5n5t0o5w5r4,0+5z544M5R0+49040K1v1H5Q5s0+0D4g042S0F5,5W355l2#5-014;5q5{5^4R0z0q4V0n0g0U5x4u0:524K5B5D5D5#5_045I0z5K695o4=6n5t1`4{6q5X6b6u6i4D605e5.5p6x4R5v5+5V6B015z5A2Z5C555|4R6z415|5~6E4m0i6t6I5F1L516W4S595b6A6#6v046M2?6O5!6Q5`6T5^6V6!3p6X6Z6,4H6w6|4^6)4V4X703w4I5Z5N3w5%5)5U5M6h5/0:5=5@6J4R6k6m733W6{78574S640N66687r6a4w4J7b6g6@046S4F6U6D7B5G4S6Y7g6_6J6%7N5t7p5L7S6-5}7M7u5k5u4`7R7K5^6L3D0k430z2v2W7=3/1p3;2y2A2w1W1Y2y0c1G7^0k3:0=850V0X0Z04.
3. Récupérer la dernière valeur de la file
Écrire la fonction dernier qui prend en paramètre une file contenant au moins un élément et renvoie la valeur de l'élément en queue de file.
À l'issue du traitement, la file doit avoir retrouvé son état initial.
>>> f = File ()
>>> f . enfile ( "a" )
>>> f . enfile ( "b" )
>>> f . enfile ( "c" )
>>> f
c | b | a <- tête
>>> dernier ( f )
'c'
>>> f
c | b | a <- tête
Aide
On pourra défiler un élément avant de rentrer dans la boucle classique.
Version vide Version à trous
.128013:C,ag)R1iknè9/àSé=vFmsuhb.8O4;y7ex6j2o-dt c0(wr5_P3qplf050O0H0P0e0j0$0w0Q0R0$0e0w0w0s010P0j0#010406050w0x0v0v0e0V0F040q0M0$0x0{0M0l0Q020e0v0#0E0Q0h0H150V0!0x0H0w050o12141618100#041w1D051G0o1G1I1D100O0j0t0:0=0@0_0y0j0f0y0$1W0y0P0~050+0z0$0H1R0?0^011V1X1Z1X0P1)1+1%0P0z0M0O181(0V1E0P0y0:1b0w0#0e0l0_0L011-1T010%0-0H0l1j0H1%282a2f1/2i1+2l0v2n040a0Q0Y0V0M0#0M0w0j1e1g0)260V0V0H0R2I1w2p0l1E0o242U0P2221230O2r0_1Z0l2k2F1%1O1Q0;1.2(0j2*0l1~1P1%0#2N1E2S2U2 11291g2:2g2^0V150$0~0Q0i2R330 322q351/37393b0L3e2a3g2S2%013l0e3a040Q0Z3p2T103s3j0_3v3x0Q0D3B3r333t3H3b0W3L3D3N3F3u0M383w3b0J3S3h341S3k3X3m3y0G3$3E3)3G3+3Z3y0B3/3U3;3W3Y3I0n3`3i3|3P040i0S3L1F2}1w2.2X0O2#3t0R1~2x0(1P1E2|0H2~3f484h0)4p422;010k0~0)0%483:4w0U3b4C3{4w0l0%4z0H0V0l0j4N4H4v2g0}040T4S3(4J0~4B1x4q4D4U0~0g0b3S0Q4/0Q3%3O0~2a2*0I0H3L4;4)1/0M0~0s4|4=3V0l0~0u2j4Y3t4V0T0g4.4:54430~0H0$0P534~0_5004524%3q4}4I364#5a3V5q0A5z5i044A595t2T5h4w5c5e5I0 4:5v4T1/4y040U1V1+5n5w4 4F042^5m5O5R4Z5x044$315o015B5D4!041u0P0X0t0j0)5@4*4W4,5f5Q4/5K5-4^0H4`604 0~5C5O673k5j4K5H5:5!0_5c6c3G5j5l6q014V5N2 06655g5;565_6t5*6h5p515Z5S6r5.6u5?6g6C4M2t4{6Q6n6v0~5d645+3t5U5W6l3f6#5A5$5(6K5,6i04696b6V6L5=6e6u6D5`5|5~6U6m6_5M4-5O6z6A6+5E5/4(6W6P726:6M2k6T6u6p6^7g3u4@0l4_717c6_7e7t7n6D5G5Y7m5b6Y0g6x3f77666R6N7B5A6{7L5E7i6)3q6H6X4W6|6s5)7f7C047F3q7H794w5U2N0P0x4O6/4?6E7Y7G1w4s4o497`0o4c1w0P4e7 2Z2V1}1 2X0e1*7|4c1C4u7n2N0v0X0%0e0k0H0X0y0Z0~1o1q1s1u0Q75311J3g1D0C1g0#0H1d0Q0e0x0@0j0Q2|0M0R0r0)0V0Q2k0Q1d0-0j0w2a0P0Q0=0Q0%1f2P0j1f4;7_040+0-7A8-0Q0O0r2i4P1,0O2a0/8#4n0v0j0m2N0Q8s0w2I6f1M4k2/3|1;1Y1!1$8d3t6T2v2x2z0q0R0V0|8Z0Y0F241f484n8d304q8-7T5U4A6u5$4;7O4J4L5F4N8`0V7k6Y7W7K7Z3V6w8v6*7(7T6D6?7s5u7T5q5s2 7)5-587A9U3|5M6!9D4#3X7:550~0j9{3|0M5$2?9 4J0z0~0V2a0f9%5J5;7l9;5^8/0$9:7w7!4X9J5-7b7Sad4+a42g5q0Nat1/910~3dan1/9W6!5Q9!7p7r6O7Naf5-7Qajaq6Waeak9|9TaTa0aLaW5^7zab9i9V7D7$3CaG7J0Iax6I5ra/7oaVaQ7uaYa^7x6S7RacaR7D9@5;6%5Xa$9-5#0~6.6G7J9$aK046faM6;6~5}5 aC6o7D9X7%78b76Mapa a_bf9SaOa$7TaSa{7;bdbm6`bxbG7y0H7jbG5Ma*5P6B6W6Dbua%aXbIbh7h6kaPbv7nbCb$7;a.bNas76a,6W7+0*7.0la=6Db+6y7^4i2U9y4b4l8c0c0*0P1,0e0#8L0R0yc60Q0P0M1dbL0M8W8!8{0r8X0t8Y0eaa8?1,290V4h7.0j8Q0)0x0I8$ci8~0e8$2j8u8T2*8K8f92948%cj0$3X0/0O0x0:3w0R0x0$cs8!cGah1+0dcK1,0w2O1f2KcS0VcU1,8#0V0rcZ0#0ra82I8?cW8P9O0Q0r0$0r2w0l0P998y048A8Kcf2M0,8Zc.8K1.4Nc$0R8{cf89dmcvdh0/8S0e0Kcf0+dacK8F1^9q0z8E058-c)6U8=0pc%2r1,dKb}9/dNb}0A0Qc38Z0edG0jdIdk4Ndj0Q910/dPdA7.0QdPca0e8s8R1k2jd98Z0*8?8^d}2kd 8Z1O2N2P1pe48F0Rdq8Idt8X0l0/0e0tci8QdPcucw9q8Q0$002kc.0vdt0)0/co1+7.0wdc107}0*0,0.04.
.128013:C,ag)R1iknè9/àSé=vFmsuhb.8O4;y7ex6j2o-dt c0(wr5_P3qplf050O0H0P0e0j0$0w0Q0R0$0e0w0w0s010P0j0#010406050w0x0v0v0e0V0F040q0M0$0x0{0M0l0Q020e0v0#0E0Q0h0H150V0!0x0H0w050o12141618100#041w1D051G0o1G1I1D100O0j0t0:0=0@0_0y0j0f0y0$1W0y0P0~050+0z0$0H1R0?0^011V1X1Z1X0P1)1+1%0P0z0M0O181(0V1E0P0y0:1b0w0#0e0l0_0L011-1T010%0-0H0l1j0H1%282a2f1/2i1+2l0v2n040a0Q0Y0V0M0#0M0w0j1e1g0)260V0V0H0R2I1w2p0l1E0o242U0P2221230O2r0_1Z0l2k2F1%1O1Q0;1.2(0j2*0l1~1P1%0#2N1E2S2U2 11291g2:2g2^0V150$0~0Q0i2R330 322q351/37393b0L3e2a3g2S2%013l0e3a040Q0Z3p2T103s3j0_3v3x0Q0D3B3r333t3H3b0W3L3D3N3F3u0M383w3b0J3S3h341S3k3X3m3y0G3$3E3)3G3+3Z3y0B3/3U3;3W3Y3I0n3`3i3|3P040i0S3L1F2}1w2.2X0O2#3t0R1~2x0(1P1E2|0H2~3f484h0)4p422;010k0~0)0%483:4w0U3b4C3{4w0l0%4z0H0V0l0j4N4H4v2g0}040T4S3(4J0~4B1x4q4D4U0~0g0b3S0Q4/0Q3%3O0~2a2*0I0H3L4;4)1/0M0~0s4|4=3V0l0~0u2j4Y3t4V0T0g4.4:54430~0H0$0P534~0_5004524%3q4}4I364#5a3V5q0A5z5i044A595t2T5h4w5c5e5I0 4:5v4T1/4y040U1V1+5n5w4 4F042^5m5O5R4Z5x044$315o015B5D4!041u0P0X0t0j0)5@4*4W4,5f5Q4/5K5-4^0H4`604 0~5C5O673k5j4K5H5:5!0_5c6c3G5j5l6q014V5N2 06655g5;565_6t5*6h5p515Z5S6r5.6u5?6g6C4M2t4{6Q6n6v0~5d645+3t5U5W6l3f6#5A5$5(6K5,6i04696b6V6L5=6e6u6D5`5|5~6U6m6_5M4-5O6z6A6+5E5/4(6W6P726:6M2k6T6u6p6^7g3u4@0l4_717c6_7e7t7n6D5G5Y7m5b6Y0g6x3f77666R6N7B5A6{7L5E7i6)3q6H6X4W6|6s5)7f7C047F3q7H794w5U2N0P0x4O6/4?6E7Y7G1w4s4o497`0o4c1w0P4e7 2Z2V1}1 2X0e1*7|4c1C4u7n2N0v0X0%0e0k0H0X0y0Z0~1o1q1s1u0Q75311J3g1D0C1g0#0H1d0Q0e0x0@0j0Q2|0M0R0r0)0V0Q2k0Q1d0-0j0w2a0P0Q0=0Q0%1f2P0j1f4;7_040+0-7A8-0Q0O0r2i4P1,0O2a0/8#4n0v0j0m2N0Q8s0w2I6f1M4k2/3|1;1Y1!1$8d3t6T2v2x2z0q0R0V0|8Z0Y0F241f484n8d304q8-7T5U4A6u5$4;7O4J4L5F4N8`0V7k6Y7W7K7Z3V6w8v6*7(7T6D6?7s5u7T5q5s2 7)5-587A9U3|5M6!9D4#3X7:550~0j9{3|0M5$2?9 4J0z0~0V2a0f9%5J5;7l9;5^8/0$9:7w7!4X9J5-7b7Sad4+a42g5q0Nat1/910~3dan1/9W6!5Q9!7p7r6O7Naf5-7Qajaq6Waeak9|9TaTa0aLaW5^7zab9i9V7D7$3CaG7J0Iax6I5ra/7oaVaQ7uaYa^7x6S7RacaR7D9@5;6%5Xa$9-5#0~6.6G7J9$aK046faM6;6~5}5 aC6o7D9X7%78b76Mapa a_bf9SaOa$7TaSa{7;bdbm6`bxbG7y0H7jbG5Ma*5P6B6W6Dbua%aXbIbh7h6kaPbv7nbCb$7;a.bNas76a,6W7+0*7.0la=6Db+6y7^4i2U9y4b4l8c0c0*0P1,0e0#8L0R0yc60Q0P0M1dbL0M8W8!8{0r8X0t8Y0eaa8?1,290V4h7.0j8Q0)0x0I8$ci8~0e8$2j8u8T2*8K8f92948%cj0$3X0/0O0x0:3w0R0x0$cs8!cGah1+0dcK1,0w2O1f2KcS0VcU1,8#0V0rcZ0#0ra82I8?cW8P9O0Q0r0$0r2w0l0P998y048A8Kcf2M0,8Zc.8K1.4Nc$0R8{cf89dmcvdh0/8S0e0Kcf0+dacK8F1^9q0z8E058-c)6U8=0pc%2r1,dKb}9/dNb}0A0Qc38Z0edG0jdIdk4Ndj0Q910/dPdA7.0QdPca0e8s8R1k2jd98Z0*8?8^d}2kd 8Z1O2N2P1pe48F0Rdq8Idt8X0l0/0e0tci8QdPcucw9q8Q0$002kc.0vdt0)0/co1+7.0wdc107}0*0,0.04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)