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
.128013bqêO,9vi3o_x;}lpw!f( g0]6)2sç18ené4è[Em5tLRPhk:c.a=ryzFSIu/7{dô050.0G0P0Y0i0p0C0v0W0p0Y0C0C0Z010P0i0q010406050C0*0N0N0Y0!0#040(0k0p0*130k0H0v020Y0N0q0n0v0R0G1d0!0c0*0G0C050+1a1c1e1g180q04051L1E1O0+1L180.0i0h0{0}0 110T0i0w0T0p1$0T0P16050?0b0p0G1X0~10011#1%1)1%0P1/1;1-0P0!1M0P0T0{1j0C0q0Y0H110B011?1Z010t0^0G0H1r0G1-292b2g1^2j1;2m0N2o040a0v0S0!0k0q0k0C0i1m1o0;270!0!0G0W2J1E2q0H1M0+252V2224231.0.2s111)0H2l2G1-1U1W0|1@2)0i2+0H0k2/1-0q2O1M2T2V30192a1o2;2h2_0!1d0p160v0E2S3417332r361^383a3c0B3f2b3h2T2(013m0Y3b040v0j3q2U183t3k113w3y0v0J3C3s343u3I3c0O3M3E3O3G3v0k393x3c0z3T3i351Y3l3Y3n3z0,3%3F3*3H3,3!3z0F3:3V3=3X3Z3J0g3{3j3}3Q040E0x423)2=3~3-0E3e1F3g3U434b450E3p4g3r4i4a373@3y0E3B4o3D3(3P4t160E3L4x2V2}0G2V2/2Y0.242%3W0W2`2y0:1V1M4H2 3g3M054Q0;4X4j37160k0*0h0!2b0P3M0v4z3W0k160Z4;4?3}0C2e04021A0k0P0n0u0L0-020p54510*530n493P160t0G3Z0H4:4F4=3;4b4^044`5o4|4b4~165c5e0A0y0o020w5b52545g3W0H4*4,5k0P0*2O4{5q2h5s5u305p3|4b15040-4Z5U3l5i5)5!2h5$0V5T5.5+040k5=4(1^0U5i3Y5`4r5@5_4F5w5/160f605h040t694@0r162@6d440b160$145-5{115$0u6o613H5N4-4/6t3u5$685v5*6v6b5k1d5m6z3W5$0A0o3T064q3u5}040;6c646E016f3z6K440t161C0P0l0b0i2l0l2a2O5m0T1C0G0G6$5#166s6X5?6F0G0m4H0 0i1n6{66040A5;4F060v7f5Z6p3v160q2k6i5r4_7n790L0y3T7g7h6u016T0t5 6D707j040W7q1^0k6!6h7C7i5M0472742H776 7i5:7u7v7g655|6g6W5Y7!6F7G7M7x7J6g0H7H6F4+6x6J7U7x7W7d7Y7}7w6a7l1;787I160X836F0Y0q0q2l0.87016r8e7O7+326Y6M7X7}7)7y6)1)7%3g7 5L168j8u8p7.047L7(6Y7O5j5l5n8k7D7{307e7~7v8p6T0i8t3r8v447k7m7,3u5W5X8z8l167s7;018B7B8E7D7O816`7_8#858h7k2E8e6r0A8,5s0s8%8V8p7O7?5P5R8@8K7V8*8{7F8~160y7c8N8P8P8R162O5Q0!7:8!3W0U0W160%3x0C9b4h8Q6Y6T9q5R9t8:7N8Y829u3}8$8,5$8+7d1E4#4I1P2~1E4K1E0P4M9$2#2W0Y1:9X0+4K1K4%7x2O0N0l0t0Y0U0G0l0T0j161w1y1A1C0v9k4Y1R3h1L0)0p0v0#0v0Y0v0q1k2H0G5R0`9`0D1n0`2L4Q0H0C220*0i2O0v1;0v1U2Q760H2maz1=0;0`980!9ra51@0k0W0i0IaQ0*0m0v8H2xaP0C86a99;0Qah0h5k7S352`aV0v2laD5R0v1A0i0v0H006*ai0~0v0w0I0H0I4.1)0C9,1;a(1S4T2:3}1`1(1*1,9=3u2u2l2n162A0(0W0!140P2B0#257T324W3(314Y9Wbm8w5^5OaO9a917p9O6|5%8e0C0E5z030j0g0n0A02bXbZ9h04a7956YbUbWbY55b$b:b)6C9K7xb.50b%0n0yb=b(8^6L16b+2U8W5xbVb|b:0Lc05fc23}6B8,b{cd5Eb}b)c56#b-c9cd58cmcfbRb^8(7Dcjb}5F5bcu9c7`c4cicrcB5a0ncdb)6O9U0+bH9Y9.9:1N04a+ai9@0i0KaA0Ya-0W0v0b4+0|1=7cbe2/3ubi1|1+2p7Dbo2w2ybsbubwbybA9J4YbD3264cS8F6w4.7^b_8_5tci4 5A545658cLdjce8N965i6H6ybQ5VbPde3W5y505Ib!5DcCcMdC5K8XbKa-bM5Sdv84dgdO6q160-cP5Yc72h0Wc903aD0iaF1naIaA0h0i0;dI4b7z8/cy9L8C917Kd4b,8;6k04dc0w9C3r8p8gcv37d~2vb)6~cF6aa!duecc37a7b8ndX62bLaPb)0L9feedd4Y8)04eqe65@0ib)0y7tdR8-dxd?7x974,dc8Jeu8L9eey6FeAeQ8f9i3%cR4R4G9Z9/4Ua*ah9Bau2L6;271s0!0I6@avaGa61P3hc=3Wc@bkc`7ic|bq2z0vbtbv0qbx0Sbz0TbBd59Zd732d98;dbefeHdf94c68pdAdodl595H5d5J9Uda6G8IbOdQdy4}didC5C5E5GdGfudp4hdrdK99dNfC7ofBfkeh5(eT8Gdtete3evexegdJeSf(bR9j8,eJ7@eMf#eOew9ff*eN9d04eDfR2hd;0!f.6gd_7/f.d~e0e22Ue46}8he82leaerfZf;gaev0A6NeWcS1Re!cV1L0(2b0`1;0`2@aE1C0fagc)0v0*1oaw0#aC7A0Hd(aH0G0pgC1n0v6m8a1=gG0v0I0p0I2x5maD1=4!eYes5nbHgD2P0{gPayag0 aSaUg(4=bH7?eL9VeYgC0.gvaB1=0N0d2x0v3Y0.2Obde_1Vc?1*c^bl8pf02xbrf3d0f6d2fad{gad6a8ffeYfNg~fjd|7i5Wdh5zdCfrdndHfwfhfy6Igjcp7DhFeEfpfFdEfIdod/4)fOdMg9hRhEeGhDcGbSfX5,eT8MfUdJ63f~7#6bd=h,edb@g25^g48Chuh)eId~gUggh/hOhCgkf?cxh}bJhBf!idf{gncQgpbDe#0haa040e0*c+6.1oa@0I0W0T2be14/h50v0!0/aC2Lg*4$g,h04$a?bxiM4Iiig-eYaDh4aCgUgC4Q1caKiZ1=4Q2N1$0I0v0P4+bxa@iC1lhe9;0M0H2j0HgC0^a?aw0vh7h92F759-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 == ...