Bien parenthésée (2)

On considère dans cet exercice un parenthésage avec les couples (), {}, [] et <>. On dira qu'une expression est bien parenthésée si chaque symbole ouvrant correspond à un symbole fermant et si l'expression contenue à l'intérieur est elle-même bien parenthésée.

Bien parenthésées

  • (2 + 4)*7
  • tableau[f(i) - g(i)]
  • #include <stdio.h> int main(){int liste[2] = {4, 2}; return (10*liste[0] + liste[1]);}

Mauvais parenthésage

XKCD 859

  • (une parenthèse laissée ouverte ; pas de fermante associée à (.
  • {<(}>) ; mauvaise imbrication.
  • c'est trop tard ;-) ; pas d'ouvrante associée à ).

Écrire une fonction est_bien_parenthesee qui détermine si une expression passée en paramètre est bien parenthésée avec les couples (), {}, [] et <>. La fonction renvoie un booléen. L'expression sera une chaine de caractères de longueur au plus 1000.

Exemples
>>> est_bien_parenthesee("(2 + 4)*7")
True
>>> est_bien_parenthesee("tableau[f(i) - g(i)]")
True
>>> est_bien_parenthesee("int main(){int liste[2] = {4, 2}; return (10*liste[0] + liste[1]);}")
True
>>> est_bien_parenthesee("(une parenthèse laissée ouverte crée une tension intense qui dure toute la journée.")
False
>>> est_bien_parenthesee("{<(}>)")
False
>>> est_bien_parenthesee("c'est trop tard ;-)")
False

On pourra compléter le code donné qui utilise un dictionnaire ouverture qui renvoie l'élément ouvrant associé à la clé fermante.

🐍 Console Python
>>> ouverture['}']
'{'
>>> ouverture['>']
'<'
###(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
.128013oèé{3IpôRa[7gq 6!/ê09ç]yemit=ldE.k2v:L1b,}cu)hx58n4_O;frSwzF(sP050F0z0C0k0B0E0.0p0R0E0k0.0.0D010C0B0h010406050.0S0A0A0k0(0y040)0b0E0S130b0Y0p020k0A0h0$0p0j0z1d0(0o0S0z0.050s1a1c1e1g180h04051L1E1O0s1L180F0B0K0{0}0 110U0B0n0U0E1$0U0C16050?0O0E0z1X0~10011#1%1)1%0C1/1;1-0C0(1M0C0U0{1j0.0h0k0Y110J011?1Z010%0^0z0Y1r0z1-292b2g1^2j1;2m0A2o040a0p0/0(0b0h0b0.0B1m1o0;270(0(0z0R2J1E2q0Y1M0s252V2224231.0F2s111)0Y2l2G1-1U1W0|1@2)0B2+0Y0b2/1-0h2O1M2T2V30192a1o2;2h2_0(1d0E160p0N2S3417332r361^383a3c0J3f2b3h2T2(013m0k3b040p0f3q2U183t3k113w3y0p0Z3C3s343u3I3c0W3M3E3O3G3v0b393x3c0q3T3i351Y3l3Y3n3z0m3%3F3*3H3,3!3z0X3:3V3=3X3Z3J0v3{3j3}3Q040N0u423)2=3~3-0N3e1F3g3U434b450N3p4g3r4i4a373@3y0N3B4o3D3(3P4t160N3L4x2V2}0z2V2/2Y0F242%3W0R2`2y0:1V1M4H2 3g3M054Q0;4X4j37160b0S0K0(2b0C3M0p4z3W0b160D4;4?3}0.2e04021A0b0C0$0-0l0e020E54510S530$493P160%0z3Z0Y4:4F4=3;4b4^044`5o4|4b4~165c5e0T0x0Q020n5b52545g3W0Y4*4,5k0C0S2O4{5q2h5s5u305p3|4b15040e4Z5U3l5i5)5!2h5$0L5T5.5+040b5=4(1^0I5i3Y5`4r5@5_4F5w5/160P605h040%694@0*162@6d440O160+145-5{115$0-6o613H5N4-4/6t3u5$685v5*6v6b5k1d5m6z3W5$0T0Q3T064q3u5}040;6c646E016f3z6K440%161C0C0!0O0B2l0!2a2O5m0U1C0z0z6$5#166s6X5?6F0z0V4H0 0B1n6{66040T5;4F060p7f5Z6p3v160h2k6i5r4_7n790l0x3T7g7h6u016T0%5 6D707j040R7q1^0b6!6h7C7i5M0472742H776 7i5:7u7v7g655|6g6W5Y7!6F7G7M7x7J6g0Y7H6F4+6x6J7U7x7W7d7Y7}7w6a7l1;787I160H836F0k0h0h2l0F87016r8e7O7+326Y6M7X7}7)7y6)1)7%3g7 5L168j8u8p7.047L7(6Y7O5j5l5n8k7D7{307e7~7v8p6T0B8t3r8v447k7m7,3u5W5X8z8l167s7;018B7B8E7D7O816`7_8#858h7k2E8e6r0T8,5s0r8%8V8p7O7?5P5R8@8K7V8*8{7F8~160x7c8N8P8P8R162O5Q0(7:8!3W0I0R160,3x0.9b4h8Q6Y6T9q5R9t8:7N8Y829u3}8$8,5$8+7d1E4#4I1P2~1E4K1E0C4M9$2#2W0k1:9X0s4K1K4%7x2O0A0!0%0k0I0z0!0U0f161w1y1A1C0p9k4Y1R3h1L0g0E0p0y0p0k0p0h1k2H0z5R0`9`0w1n0`2L4Q0Y0.220S0B2O0p1;0p1U2Q760Y2maz1=0;0`980(9ra51@0b0R0B0daQ0S0V0p8H2xaP0.86a99;0Mah0K5k7S352`aV0p2laD5R0p1A0B0p0Y006*ai0~0p0n0d0Y0d4.1)0.9,1;a(1S4T2:3}1`1(1*1,9=3u2u2l2n162A0)0R0(140C2B0y257T324W3(314Y9Wbm8w5^5OaO9a917p9O6|5%8e0.0N5z030f0v0$0T02bXbZ9h04a7956YbUbWbY55b$b:b)6C9K7xb.50b%0$0xb=b(8^6L16b+2U8W5xbVb|b:0lc05fc23}6B8,b{cd5Eb}b)c56#b-c9cd58cmcfbRb^8(7Dcjb}5F5bcu9c7`c4cicrcB5a0$cdb)6O9U0sbH9Y9.9:1N04a+ai9@0B0caA0ka-0R0p0O4+0|1=7cbe2/3ubi1|1+2p7Dbo2w2ybsbubwbybA9J4YbD3264cS8F6w4.7^b_8_5tci4 5A545658cLdjce8N965i6H6ybQ5VbPde3W5y505Ib!5DcCcMdC5K8XbKa-bM5Sdv84dgdO6q160ecP5Yc72h0Rc903aD0BaF1naIaA0K0B0;dI4b7z8/cy9L8C917Kd4b,8;6k04dc0n9C3r8p8gcv37d~2vb)6~cF6aa!duecc37a7b8ndX62bLaPb)0l9feedd4Y8)04eqe65@0Bb)0x7tdR8-dxd?7x974,dc8Jeu8L9eey6FeAeQ8f9i3%cR4R4G9Z9/4Ua*ah9Bau2L6;271s0(0d6@avaGa61P3hc=3Wc@bkc`7ic|bq2z0pbtbv0hbx0/bz0UbBd59Zd732d98;dbefeHdf94c68pdAdodl595H5d5J9Uda6G8IbOdQdy4}didC5C5E5GdGfudp4hdrdK99dNfC7ofBfkeh5(eT8Gdtete3evexegdJeSf(bR9j8,eJ7@eMf#eOew9ff*eN9d04eDfR2hd;0(f.6gd_7/f.d~e0e22Ue46}8he82leaerfZf;gaev0T6NeWcS1Re!cV1L0)2b0`1;0`2@aE1C0Pagc)0p0S1oaw0yaC7A0Yd(aH0z0EgC1n0p6m8a1=gG0p0d0E0d2x5maD1=4!eYes5nbHgD2P0{gPayag0 aSaUg(4=bH7?eL9VeYgC0FgvaB1=0A0t2x0p3Y0F2Obde_1Vc?1*c^bl8pf02xbrf3d0f6d2fad{gad6a8ffeYfNg~fjd|7i5Wdh5zdCfrdndHfwfhfy6Igjcp7DhFeEfpfFdEfIdod/4)fOdMg9hRhEeGhDcGbSfX5,eT8MfUdJ63f~7#6bd=h,edb@g25^g48Chuh)eId~gUggh/hOhCgkf?cxh}bJhBf!idf{gncQgpbDe#0Kaa040#0Sc+6.1oa@0d0R0U2be14/h50p0(0iaC2Lg*4$g,h04$a?bxiM4Iiig-eYaDh4aCgUgC4Q1caKiZ1=4Q2N1$0d0p0C4+bxa@iC1lhe9;0G0Y2j0YgC0^a?aw0ph7h92F759-aD00iAbvdNc;hge{hie}bI3}hmc~hpf5f7f9fbe3hwe3d8hzfxaNeoeEhTh_3Hd~aEhQgb04ebf`i66l6nh;gciaiOjP04iffnjyeKicjkbRgmgohzgqcUe$9!0=0@0_04.
Indice 1

On utilisera une pile qui empile les ouvrants, dépile un ouvrant dès qu'un fermant est rencontré en vérifiant la correspondance, et qui ignore les autres caractères.

Indice 2

On pourra compléter le code

🐍 Script Python
def est_bien_parenthesee(expression):
    pile = ...
    for c in ...:
        if c in ...:
            pile.append(...)
        elif c in fermant:
            if ... or ... != ouverture[c]:
                return False
    return pile == ...