Expression 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)
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]etd5!ôfz18umaèg,_F/çR=in{ 6)yqPhcL[(bEsx.p;r4'90"ovw73êOk:é }2I030a08090k0u050K0(0E050k0K0K0t0U090u0N0U020x030K0i0j0j0k0P0A02060V050i0 0V0v0(000k0j0N0O0(0s08190P0B0i080K030q16181a1c140N02031H1A1K0q1H140a0u0W0@0_0{0}0D0u0m0D051Y0D0912030/0I05081T0`0|0U1X1Z1#1Z091*1,1(090P1I090D0@1f0K0N0k0v0}0*0U1.1V0U0e0;080v1n081(24262b1:2e1,2h0j2j02040(0C0P0V0N0V0K0u1i1k0-220P0P080E2E1A2l0v1I0q202Q1}1 1~1)0a2n0}1#0v2g2B1(1Q1S0^1/2!0u2$0v0V2)1(0N2J1I2O2Q2`15251k2+2c2:0P1905120(0g2N2~132}2m301:3234360*39263b2O2Z0U3g0k35020(0Z3k2P143n3e0}3q3s0(0Q3w3m2~3o3C360b3G3y3I3A3p0V333r360y3N3c2 1U3f3S3h3t0Y3X3z3!3B3$3U3t0h3)3P3+3R3T3D0S3;3d3?3K020g0T3{3Z2,3@3%0g381B3a3O3|443~0g3j493l4b43313-3s0g3v4h3x3Y3J4m120g3F4q2Q2@082Q2)2T0a1 2Y3Q0E2;2t0,1R1I4A2_3a3G034J0-4Q4c31120V0i0W0P26093G0(4s3Q0V120t4)4+3?0K2902001w0V090O0H0G0w00054|4_0i4{0O423J120e083T0v4(4y4*3*444-024/5g4;444?1254560z070)000m534`4|583Q0v4Z4#5c090i2J4:5i2c5k5m2`5h3=4411020w4S5M3f5a5X5S2c5U0%5L5$5Z020V5)4X1:0$5a3S5.4k5+5-4y5o5%120n5@59020e604,0X122.643}0I120f105#5/0}5U0H6f5^3B5F4$4'6k3o5U5 5n5Y6m625c195e6q3Q5U0z0)3N0x4j3o5;020-636u5*3B0e121y090o0I0u2g0o252J5e0D1y08086B3?6i6*4d6S0L4A0{0u1j6-5}020z5(4y0x0(6 5R6g3p120N2f695j4.776_0G073N70716l0U6K0e5?6O725E020E7a1:0V6602687m7h7o086:2J6=6@5{6v0U5'7e7f705|5:676N5Q7M6w7q7x3o7t670v7r6w4!6o6A7F6P7H126|2`6~7K7.7R7302751,6^7s120M7^6w0k0N0N2g0a7|7)026j7'7n127T2|7G6D7J7/7G6K081#7P3a7g618a8l7:7W7v7Y7U5D5a6y6p877h7I6}7.8f7(6K0u8k3l8m8v7=768u3?5O5P8p8c127c7Z0U8r7l7Q7G7o7?6)8z7V7`838$2z836i0z8W5k0c8R8J7:7o7#5H5J8'8b7(5U0G8+898.12077+4a8D9a8K3?6K2J5I0P8t8!8F0E120p3r0K8~997L8g129f5J9i8S7(8$8N9j728Q8W917d6}1A4U4B1L2^1A4D1A094F9Q2W2R0k1+9L0q4D1G4W7h2J0j0o0e0k0$080o0D0Z121s1u1w1y0(983l1L3b1H0+050(0A0(0k0(0N1g2C085J0?9*0r1j0?2G4J0v0K1}0i0u2J0(1,0(1Q2L6?0v2ham1-0-0?8{0P9g9^1/0V0E0u0'aD0i0L0(5b330.8}0K7{1N9}020Fa40W5c2C1j220aaI0(2gaq5J0(1w0u0(0v0R6Ta50`0(0m0'0v0'4%1#0K9W1,aS1O4M2*3?1=1!1$1'9$3o2p2g2i122v060E0P10092w0A207E2|4P3Y2{4R9Kbb8LaAaC8;798O5T125W8(3Q0K0g5r010Z0S0O0z00bMbO95029`2P9c5pbK4^bS4}bRbN57bH6+5~8WbJbLb(07b'bTb*bEbVb-b!b=0O0Gb|bU6t9C7hb.b#b(5wb$bUbW3t7:c4b|50c8b@6_c19y72cdb$5x53cg8 728Bc23ocmb(51cpb(bU6F9I0qbw9M9Y9!1JaVa44A0j0u0lan0kaY0E0(0I4!0^1-6|b32)3ob71@1%2k7(bd2r2tbhbjblbnbp9x9{bs2|5{cF8#6n4%7%cu4,bCd04=4@5s4|4~50520Od6b)7,8_8w5d5fd3785lb-d55AbP5vcodbdo5C3}6n8|5KbD5Nd2ck8AbFcC5QbY2c0Eb!01aq0uas1javan0W0u0-du447j8ZdC610u8;7u7wdj316b02c~0m9q9{8T858+d*2qbU86cr7ydg6zdi4Rd:0z6{8edH5_5GaB8}bU92ch5+aNd}e9937vbU079Hd(7_dldze57$d~d/908Uegd#eb6h963XcE4K4z9N9Z4N9#aW0(9pah2G6!221o0P0'6%aiat9_9|1P1Rc$1$c'ba7:c+bf2u0(bibk0Nbm0Cbo0Dbq4Rc^4Rc`eCdf5,4#c~erbX8qdB8^7G5q4^dod8cyds555B9Ic|6xdhbBenel0}f5dc5u5w5yfa56dV4Ye|aYe7dyfj8Xf2f0d:bGd`61ed8yfE6Ceuex7;ewfIb+02978W8`e}fHd et02eafO6.ehfL5UekdZ3QdX0PfS67d$7XfSd*d,d.2P7:6,fL0vd?2gd^egfGc fWcs12e1dF4a9Je`1NeEcI1H06260?1,0?2.ar1y0na3cS0(0i1kaj0Aap7k0vdOau8igna#6d7 1-gr0(0'050'2s5eaq1-4TeCg15fbwgo2K0@8iala30{aFaHgN4*bw7#e~g94Vgn0aggao1-0j0!2s0(3S0a2Jb23bc#3Qc%b9c)72e'2sbge*c/e-c;e;c?f^e@9{e_4Ve{g)fVf37(5Odm5rf74 f9dcfsec8xg2hl9DfAcbf4dnfbdpfo5zhEhu7!e6bAeo0}hnhN84fDg3d{62c9f-5,8Wf+hX8If^d:cjhyhU5`fy8rd'f)6a6c6ef%12d_hTfFhwe bxfPh(fB9zc}hkh%fX6EeAcFgbcHeGcJ0#0icU6X1ka)0'0E0D26d-4'g:0(0P0dap2GgP4VgRg+4Ba(bmiv4Bhj7%gTg.aiipgDgn4J18axg/ap4J2I1Y0'0(094!bma)il1hg|9#0J0v2e0vgn0;a(aj0(g=g@2A6=9Xaq0Rijbkdyc!eYg e!h1h}44h4c-h7e,e.e:e=c@9Nc_2|c{i1fudxf@hBhmhAe43Bd*arh|f_h@d=h;0Nf f{d|i3j2cihXiEjre08:cDi8bseF0W3b9Z0.0:0=02.
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 == ...