Aller au contenu

Mots de Dyck⚓︎

On cherche dans cet exercice à générer l'ensemble des mots de Dyck de taille \(n\).

Un mot de Dyck de longueur \(n\) est une expression bien parenthésée comptant \(n\) paires de parenthèses.

Par exemple, (())() est un mot de Dyck de longueur \(3\). ()) n'est pas un mot de Dyck car il y a une parenthèse fermante de trop.

Définition précise

Un mot de Dyck (unilatère) de taille \(n\) compte exactement \(n\) parenthèses ouvrantes '(' et exactement \(n\) parenthèses fermantes ')'.

De plus, à chaque endroit de la chaîne, le nombre de parenthèses ouvrantes déjà rencontrées est toujours supérieur ou égal à celui de parenthèses fermantes.

Il est possible de générer les mots de Dyck de taille \(n\) en utilisant une pile :

  • on empile initialement le mot vide ;
  • tant que la pile est non vide :
    • on dépile un mot ;
    • si ce mot est de la longueur souhaitée, on l'ajoute à la liste de mots de Dyck cherchés ;
    • sinon s'il est possible de lui ajouter une parenthèse ouvrante, on l'ajoute et l'on empile le nouveau mot ;
    • enfin s'il est possible de lui ajouter une parenthèse fermante, on l'ajoute et l'on empile le nouveau mot.

Ce procédé est illustré ci-dessous dans le cas de la construction de mot de taille \(n=3\).

graph LR
    R{ } --> N1{"("}
    N1 --> N2{"(("}
    N1 --> N3{"()"}
    N2 --> N4{"((("}
    N2 --> N5{"(()"}
    N3 --> N6{"()("}
    N4 --> N7{"((()"}
    N5 --> N8{"(()("}
    N5 --> N9{"(())"}
    N6 --> N10{"()(("}
    N6 --> N11{"()()"}
    N7 --> N12{"((())"}
    N8 --> N13{"(()()"}
    N9 --> N14{"(())("}
    N10 --> N15{"()(()"}
    N11 --> N16{"()()("}
    N12 --> N17{"((()))"}
    N13 --> N18{"(()())"}
    N14 --> N19{"(())()"}
    N15 --> N20{"()(())"}
    N16 --> N21{"()()()"}

Écrire la fonction mots_dyck prenant en argument un entier n et renvoyant la liste des mots de Dyck de taille n. Ces mots comptent donc n paires de parenthèses.

Il est inutile de trier la liste des résultats.

Exemples
>>> mots_dyck(0)
['']
>>> mots_dyck(1)
['()']
>>> mots_dyck(2)
['(())', '()()']
>>> mots_dyck(3)
['((()))', '(()())', '(())()', '()(())', '()()()']
###(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
.128013s3_8èufv»Iy n7aS1me(P24C:jtw«i]D[h*)6Oo;bcdg/T0làqp!.rL-,=+Nk95Rxé050R0t0B0p0E0W0b0m0Q0W0p0b0b0*010B0E0Z010406050b0g0s0s0p0$0l040q0N0W0g160N0n0m020p0s0Z0O0m0:0t1g0$0Y0g0t0b050T1d1f1h1j1b0Z041H1O051R0T1R1T1O1b0R0E0i0~1012140I0E0S0I0W1+0I0B19050_0P0W0t1$1113011*1,1.1,0B1@1_1=0B0P0N0R1j1?0$1P0B0I0~1m0b0Z0p0n140w011{1(010h0{0t0n1u0t1=2j2l2q1}2t1_2w0s2y040a0m0v0$0N0Z0N0b0E1p1r0@2h0$0$0t0Q2T1H2A0n1P0T2f2)0B2d2c2e0R2C141.0n2v2Q1=1Z1#0 1|2?0E2^0n291!1=0Z2Y1P2%2)3a1c2k1r2~2r330$1g0W190m0r2$3e1a3d2B3g1}3i3k3m0w3p2l3r2%2=013w0p3l040m0c3A2(1b3D3u143G3I0m0x3M3C3e3E3S3m0/3W3O3Y3Q3F0N3j3H3m0L3%3s3f1%3v3,3x3J0o3;3P3@3R3_3.3J0e3}3)3 3+3-3T0.453t473!040r0V4c3?2 483`0r3o1I3q3(4d4l4f0r3z4q3B4s4k3h413I0r3L4y3N3=3Z4D190r3V4H3X4t4C494M3$4P4A4K4T4g3:4W4J3*4v3|4$3~4u4L4g444+464-4Z0r4b4;4R3^4Z0w4i4`4B4|3`0w4p3c1U381H2|2,0R2:3E0Q292I0?1!1P370t393q3W055f0@5n4{140-190@0h5p4,2r0C3m5A4=3h0h190s0N0B0b0d2a0Q0-5F5u0118040u5S513R190n5Y3E5V0K0z3%0m5-0m4%4e190W1q0S1E0g0$3W5/5B1}0N190*5|5:4l0s0E194x3a5}5G5 190J635~5!045$4W5.6b5T0n5J5L1G4P6n5Z016004626t642r5V0H0F5,5.6B3v190Z2u6g6c146x6z6a6I146D5X4P6T010b2o0401015%3*5V0)6N5T66194 3c6h5U196,6A6?6/046;5o6?5)6F6l6H6?5w040C1*1_6-6v0n0P5=2v6)475V6W6=6O3F6K6M6X70190K7b3E6x020S0B0O7u3*6|6~3B6Y5V5+736m5-6Y6p045K0B7h4l6+7B5;040N0g0i0$2l0B1F7R6C6^7U4u190h0t3-0n7$6s6S6?6Q7+3h7o7a7q7m6x0#7(6J042P0Z826U190u7t7J7K6Y760E5z6`7m7d7f6k7l5T7j877n7O5L8q5)7`6d6y6R3q6u3Z5=5@5_5{7~8o197I3a067K8N8B4(6q5M8q808q7N0p0Z0Z2v0R8u898V8R8$048b8L8O8P47760t0|0t8*8K4r8.6m8e198g8w6i7X7Z7#7%8i5T7w0W7z908r8m6 7m7H6G8{8d6?7N6L7}8n6v8U8H7c198X8Z0n8#9r5(897k9e6o8)969p190+9b6!19010u6(9y6*7*9F8C7W7Y7!7;957@7 9H9b6|559C6v7T9S8Q047.7:7=8*0K8,8`9i8/4l8f8h9Z9D9U939X7?8A6Y6x0(9b7N9/1ga29b7w7y7A9,477D8^9h9_7L9k7|8@9P479q9o9T9u8!8*0u9B7Fao8s7Qah4l6x9IaF2r9K6$0K9Oau9Q046_9~9sa09W9;ar7S9RaT9Taa94a33B9`2raH9$674g9=9@4z8|75192Y0B5`9da*7M8Ra)3N064X3*0Q0r19030m0U1F8S503E761|7/aEa#9-7P5N5P5RaY7)5W8qajbq1}8vaJ8x0*8za~7r040H8qaL6%8*728L8}04bh0$bja4aCbm5O0l5Qaybta/9(aB9f7sad61bB2(a+bw19bFbv14bH8aaO9)9z04bK4rbMbObQbC8j7e040b3,7$9xaP7i8%b:8rbTbobXcb6|69b^aQ9?b(8y9b6DbG6#9M8aaN8*aSbR7mb=0Kb?bJ4jbf9t12bia8c2c4bP0tc7cjc9bscb7NcdbVbpc8aZcQcW2r6|4GcZb-8+a=b+a5b)cob.cq9Lazctcucb9+bk47b=8actb@b#8IaR9Jcraz9?cBc^a!cx5Tczd5c@c%88d2byb;d4cAdlc 2(7G19b{4z1H5r5m1Q580T5a1H0B5cdA2.2*282a2,0p1^dvdy5j1N5t6v2Y0s0d0h0p0-0t0d0I0c191z1B1D1F0m8_7F1U3r1O0M1r1o0{0E0b1`100m0s0=2f5g0m372O2Q0=1`0R2l0}1_0m1d0A0^81d-dO0k0W0mbc0m0p0g120Ee02Q2RdK0m2V0$0=c40g0R2Y0~0^ej0;7/0Q0E0Q1`2v0md=1.0b7#eM2^0m0h1q2!0E1q0mew0Q5`2R0i1`7I1X5i2}471 1-1/1;dP3E2E2v2x192K0q0Q0$170B2L0ld~a}do5ldP3b5odue?3*765y8q5D3J8V5IaDbncUcfdf9c9=d+3Na@7mfe0t9}cO4lfh5/cRfkcT5Q0d2Y0Qfofz7{6jcva89Efpc_daaU92aW9YfLc(cwc09 a%acd88+fs1a8.bM8 di3Fc22FfKd0aU7P9=cmbAa.68cm6ff:7Nf5fccPf+8M9_a fl8T19eefp8W8Yaxf)aAdobS8tf)c*f,8ObM8=d^ak8cf-a^04f/c`7,aVa(cm0299aggBfMg4dp04g7amfu9 fF0-fH2Zf@gl8j5#fOg2fQfT7v9#f:b=dng5cXf!c+aCfVgEf:a-f:9%g!gJ83f%aXfRb%gwgrgygAg%9-g=f(g|6P19a7g#9.7/abg h6as197x9ag_a/7EgXd1gOgPangYflbUfGfIgWg-gKg{hjgCf`g@g)ha6ZcrdefYdgg/fig;9Vg?h0dhhKa9hghUhFa,hJh#1}g`go3%g8hvgR6rf|c.bEdrft74hwgSgUfJgj8(fNf)hQb,dj9Lg,gMi26YbuhVi86{hpf{8cbMa`a|fPgb4$0TfbdwdL5adO0%1`330s0PeB2Vbmeu1`0GcUiB0m0_0{e96Y1h2S0I1g7$0;19090u0n09gpej0bf10R1q0n0=e01h0miJ6?iL2fiO0tiQ04iSiUgp0(0E0f2H5/0p0m0I2Y0h1)230Z0b0z0T0T0h0$0#0C0E0-17cM0E0p0#3,0S0Tjdjf0T0,0Niw2Y5OdX0y0p0_10g3jsixe51`jxjz2l1H0p040#0md:eq5`7!0m0Xi*0t5`e02N2P0}2-0`7$0$i*00i:eGeI1`05i~j0fxj30Bj5j70T0t0(0n2R0#0S2S100P0#eX57jy0Ed(jq0w0T0e0x0.j|0P0d0Qjy3H2l0d0r1I0gec0B0T191d1!7#jJ2)e+0@iH0|4K7$193O1e1B1j0v110md(iB0}2k2Y7;0I0fd^0}0!2$kI1Ld.04bb0Q0I0nk81E2H7;0)0m0{iXf1jZese92V0R0=2tk+j(1_0}iA2ViD5Qejd;16eOeQ0R00em2-d)kj7!2!0f2Y0}kO0@kQ1h2v2fkVd)0ukReE1A0Zk`d)k|lz0peJk.5M0me(0$e8i~0Deu2N2S1`0j0m7XlI7/e81`lN0Ile0mlS2PjW2Y37exlr7/jU0}lC10lFlr0}ll0_7;ea7X0}lNd`1Z0p0S1q3He5000geS0Se 0We90j0KlT0ge01nl:1`2k0ElliFlhlE0Blklulwj+1vlAlpkSlskWejiZlg2Nk)0^0b0Keee+dy0^0`0|3rmNkC0b04.
Astuce (1)

Il n'est pas possible d'ajouter une parenthèse ouvrante si le mot en compte déjà n.

Astuce (2)

Il n'est pas possible d'ajouter une parenthèse fermante si le mot compte autant d'ouvrantes que de fermantes.

Astuce (3)

On pourra empiler des tuples du type (mot, nb_ouvrantes, nb_fermantes).