Nombre de chaînes

On a codé une chaîne de caractères en adoptant la transformation suivante :

Caractère "A" "B" "C" ... "Z"
Code "1" "2" "3" ... "26"

Ainsi, la chaîne "ABC" est devenue "123".

Cette méthode de chiffrement très rudimentaire présente plusieurs défauts. L'un d'entre eux est qu'elle n'est pas « injective » : plusieurs chaînes de départ peuvent donner le même code d'arrivée. En effet, le code "123" peut être déchiffré de plusieurs façons :

  • "1" + "2" + "3" qui donne "ABC" ;
  • "12" "3" qui donne "LC" ;
  • "1" + "23" qui donne "AW".

Le code "123" peut donc être déchiffré de 3 façons différentes.

Écrire en python la fonction nb_chaines qui prend en paramètres une chaîne de caractères non vide code uniquement composée de chiffres ("0", "1", ..., "9") et renvoie le nombre de façons dont cette chaîne peut être déchiffrée.

On garantit que le code passé en paramètre correspond toujours à au moins une chaîne de caractères. On précise de plus que les chaînes "0", "01", "02", ..., "09" ne correspondent à aucun caractère (en effet "01" est différent de "1").

Exemples
>>> nb_chaines("5")  # "E"
1
>>> nb_chaines("11")  # "AA" ou "K"
2
>>> nb_chaines("123")  # "ABC" ou "LC" ou "AW" 
3
>>> nb_chaines("11111111")  # "AAAAAAAA" ou "AAAAAAK" ou ...
34
>>> nb_chaines("10101010")  # "JJJJ"
1
###(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
.128013çD1wGsq!_iRtE/ê.npP»Cî5=u;-«2][0(AevSrLc7è )a:àK+j4Uf3,o6hgm{8éyN%xOklBd9I}b050{0J0m0T0k0_0g0R0O0_0T0g0g0y010m0k0s010406050g0z0,0,0T0M0:040L0(0_0z1g0(0r0R020T0,0s0A0R0l0J1q0M0h0z0J0g050o1n1p1r1t1l0s041R1Y051#0o1#1%1Y1l0{0k0K181a1c1e0*0k0+0*0_1^0*0m1j05130 0_0J1:1b1d011@1_1{1_0m21231 0m0 0(0{1t200M1Z0m0*181w0g0s0T0r1e0D01251=010#150J0r1E0J1 2t2v2A272D232G0,2I040a0R0t0M0(0s0(0g0k1z1B112r0M0M0J0O2%1R2K0r1Z0o2p2?0m2n2m2o0{2M1e1{0r2F2!1 1-1/1926300k320r2j1.1 0s2,1Z2;2?3k1m2u1B382B3d0M1q0_1j0R0d2:3o1k3n2L3q273s3u3w0D3z2v3B2;2 013G0T3v040R0$3K2=1l3N3E1e3Q3S0R0Z3W3M3o3O3$3w0x3*3Y3,3!3P0(3t3R3w0)3;3C3p1;3F3_3H3T0P3~3Z413#433{3T0.473?493^3`3%0|4f3D4h3.040d0G4m40394i440d3y1S3A3=4n4v4p0d3J4A3L4C4u3r4b3S0d3V4I3X3 3-4N1j0d3)4R3+4D4M4j4W3:4Z1!3i1R362_0{2}3O0O2j2S101.1Z3h0J3j3A3*054?114~4#270^1j110#50484v0e3w5b4g4E0#1j0r0 0j0O0*14321Q4*5c2B1i040H5g553#1j520J5z4L275w0S0U3;0R5M0R4T3@0r1j2R0,0(3*5O5u270(1j0y5W5P4h5w0F5F3O0,0k1j4s4Z5X5h2B57040#3_5%5Y5B040j5}5@5Z5e043b625A3P0 1j0M2v0+5E5t631e5w5y6h695l1j2P5,3@6k6r4o5C4@6u4v5I685G1e5!040X6B5-5/4q6y5v1j0S0E5L5N5(4E5S1K5V6m6C015*6L3F6b046q6X3O6t6*5Q6w116#6j6N6P5=6S2B6E5$6^5~015.4W6Q5M6_561j0k5a6}6i3P6/6g3m6~6!6-4o6%6)7e7a6,7l6n7c6;6Z6N6H3@6E0B7u4h706K7h6z1j6@3k5?696E0i6|7G741e0g2y04010G017r5w5K4Z065N7!7H6Y5R045T6W7o6Y7g7,3-7j2F7V1j6l7/6.045D7?040S7y4v7w802B7A4z7_5)7E835Z5#8a1e85727$3O5_5{0M8d7b668m0(6567796n6%6d0r6f7}7^4 6~6o6(7=7C6M5x7r7(7|8G5H7t8t6Y828P6I1j4H877D040%8p1j7x8M8e6J868B7m1j8Z8S7v8#7r8f8%7s7~7X3k7Z7#738C1j0m0(130_8!047L3A8h3@7A5;8{8}8~7a5_778m8K6x8@7.8+7p8o9m898/4h7J973L994h7P1j7S7U9r048`4B9e7#7N8n9193950X9w2=9y6T7)6V7}5+8@7(0k9O8m8?8W8H7F9H9I6R8 7{0(0z0s23959Q3T9K9k6:9E9X9(3F767}9*9x9K6E6G9t9T8L9 6=049~9o7%a1a86`1ja77M6~9%af6+9s9d9,9f699h78am7a8D3b0m8z8J6w9;9?9E7 ai8b04020_0m0A9$6J0D469E9G4Jat8}9`90923R9O9^9S3r6U5U9WaE9qay7IakaR8Ua28g7!a!9Ua-9}a/9!9Ea39Ra58caK5 9Ma%7Y8|au6Y5_2,0m0z0M0r9ja,7+ap6s1jae3L9K9ba_7Y1R5D2?4|2?4.1R0m4:bD2{2@2i2k2_0T224}4-4`1X546Y2,0,0j0#0T0^0J0j0*0$1j1J1L1N1P0RaW2=1!3B1Y0v0J1a0R0s0J1y0R1n0M4|0r0{2,0R1q0k170O120R0J0?0J0M0O0kc8b}246d0,0Q320R0V2r1F0mcd0R23c70*1K3b170g0/2u8w0m0R110z0?b}0(1p12170{2v170z1B0+6d0scx0R3_0k2F0m0/0qb:bR0v1A2#0{0/2X0r172Fca0#0#c9232r2)514@3O291`1|1~bS3O9A7R0D4yaT9D3m0oby0q0Rb?c|24b`b|0p2`24c.5o770#0M0/cG24c~2)3@d12b1}2J7a7A4)ddby0RbX0bc,b-c)050z0_3B1{1Z5Dd01|dCd49Kd7012y9#b701d$0ddc98b56F8md,d.a46~a6d=7Qd%d@b4d_a?d*d$0Pd~2?dJ2Zbi5OdWdAdYd3dE69d$0`0I0I0`0fe5bx4@04aQ0odU1ldUdy24ec2aeed53@d$d(d*d`e2d|4ye5a*aLald/6~eDeKd:eNd^7ae3endeepb_9:0Meac eyd22cef6Yeh0WeleXbyeret05eveb4hdBeAd#d|eEa;8Qe1f1d6eIeRe0d;eH9B4Gf77aeGf4eCd|e450eY53e!e9ewdXeze+eB9zd|ei0Nemfke=1Re@e_e(e{edfse~9Bd9fda=f9fgfufbfLf2fNeOeVe fR3OfffUegfie;eZe8e$fpe)dZe,f59B0!ekfy4*fl4}e?0kdTf{f+fFfrdDft4veDd-d)fOg3eIf0f!fSeTd fV9Bfjf@e7e#e%dzf e*g1fI7R0!fxf%53c(esf{1l0odRb;04b?cOdsc/c#b,dLdNdl0Kc#0Rdnc3aBcd3h0/c$b,4?cMdwcwcyc;0R3R1a0rcF0{0zcKcMcFf~4ve|fHePe daghdIeZ0Tg.0gcL2Rg;e`g?fGgpg_9Bgu4}cGcQcu24cU0TcWex0k0B111c9:0ggw1+1$1Z0T3O0+dZ2i0?2zcP130B0m0:b`1e0k1q6fhB0ThD0e0k0{2p1eg 91hMhDcxd3hT1y5!0R0*2,0#1ehhhj0q0g0K0+hW0Thm1P0O0B2Z2#2%1e2i2dcL1 hJ0+g(aO1e0fcVcx2z3@hU1wd318gI0M2z0gceh+i90Jh.h:2zhPhR0*1e0x0G0=1 0o0TbzgC0chechh,cx0%185pb+g/h3g(fne$gV0kb+2d24b^h10z0g0B5o0T0wcn4?2+1P2Zc12vcFg dj0R2,0g13g+co0RgSb ducs0Mdg0}0_cai^g(iZ2#e!1c0kbNcG00260(cfcti$iMh1g:i{0_003b1-chg-b_bUc!e$0O1r0T2.0Qc3i@i_g,heb^i$i(243b2$0k3R240UhfiNc92)c.cDcF1Pi:hocfdvcpjpjrcgdxh52Bg@h8azahab016{8=6J9c4 f^8YjTjmiO0{jf2+1.0/24j)jqc1j,glexgnf-g2a+a:bo9ub6j@dG7rj_9Y7;bk9E8Abs9.aakk8XaJg}gvdP1Y0N3_0giMjp1Aj5cFh|0zdvb~0RcSjUcF15kMja2#jd2)2u1cctcpkTk1c90K0(c63bb}0kdO1(3BgBeuf{c{4|5.jjjAjCc32)iXhpi#5pjLkX1-c^gHi`c}j.27j:d!h97R7TfzeZf`f|049:k;jT4?aG248k0,dvhndwcIjvcycdc7l00mjDb,0H0gjqj4cbc6cs0SkXkTdW0K3RhQ240Hc#c3g=j/h7ligf7R4rhb3Tc9l%lgl)f.fhfJ0)l.0Sgwe@gAdSbR0@1Bhvdq1@c^du2*2,2.1KgOc{dWj9kKm30R2`9:0KdvlUcx5.1B2R2Gldh0h2l:lf1?l?kha0kjkwfekmkz84j{lmfmi;k+h4fEh6g0l*9pb1j@kqj@8D7kmH8N8I9Y7qaImK4}hr3Bh(gC0Nhvh11x2%jv2Y2!k7b_1rlu0McFjJl7cnl;mzmRl@6v9/9|kChcl3hv2D1BgN0M17c{c.0 1ydg0IiK0TiMgVhi24kL0gdp1K2v2)lMkWj!kYjcnkexc,hQgHe$melHlJcug.cpc8kVkbchlrcvlBcJjz6dl1b,1x17cpjY0ke$dzc9j+chgY2RkS3p4@dg0Lk=9:0kiJkL4?c;hQnP1NlNca0?lQ24hUi/n^iKg$c42Fodn/nUjsk8cukaomk;bhmn1B8wi49=iZcuk.1B0HlrcHcJov17oxnjoAlskLhv1xnZiKdsi@l|kE04m2m^0O0Q2)5qj90YiZo6k9n;j-mPl(n6mB5 mUm!6DmGmE69bugieZ1Nk=nEc81xk=juk}jx18nOl2g.5Dm,1lm.bRj30Rnt2$j7jbnFk!dk2X0O0/11n.lw0TdMou0/0Obi2#gNcacT1rcPi`2`jBny17du1naOhN17jgj%pQlCo+cOgXp8b,c.0YcpgV0z1-0/177Xhs36fqgomS6Y2Ooi2R1j0I0s3hjhcXdupzni1.24pIlW15g*kNe9nYpV50bA3 3l4 by9K5_597r655O9Y5j045l5n5p3b1PaDm%n97do?8^8.g7kio=o_fS9^btmJ9EqCgb3-bmkpo^b/6~0^0O1j0;1AqzqGaq8_8gqi76axqN7`7*8p8r5sqD56qV04qX327}b.1k9Ia|q-eFqR9_7fbqqQ048$kn8)8m8j5|d*7(61eF8rktq;3#8v6eqZqS8,m$mXksqwmXm(j@6Ar0fTeUo`r9aIb3q|9eq~9Va kr6p8Frw7@a/kyq!bp7~rEeLo@96a@7Basbd8iq)bla}bnrR88adb0bvrjj^5#a)d:r7qAaor+8Xq{bc9J9.b994ryr?anqKr!r 9gr%rdrvqA9nr{qEr/q+kl047Kd{9BllaVa`rGs0a$s2r:a6s4j=qq5mi$quq:sdrOqxrQro695wqMrAagmDgefMgdr2dFrCrN8Yr(q sVkB9+atq(66q*sMqOsOsSfMaNaPsx8urLrisErqqA9{rno:8^s!s*8:r6rY8Vs^r}aYs89plu9=s|rVr;rXsbqya.qxqFsI7-arsi81f3tokisHs}setls+tks-gcrY8*sfm#rEr~t7s%9ird6%aBrts`aFtb7}s sPfSs/err:7AaTq`sqt7r#7`s1a(r(qrsB5rtNtD5 tt9KsKr(tytdfZt07zaS7}sLtTs+sYs^tSrFaZ9.u3t:8^brtw7`tyt?tnt|tptfr:7(t)7Ya{qT6c12bis@uikiu9udr,ucs}9Zsh4Jeo534+bO0o4.m11B3dj0hvb+iJpGc712cs0Rnh2#kLp pAq2iJb^0Cc40/5Un-240ukXjN1glXcBobgN0Og!kdp/kgr@j`71o|gv0R0n1B0Jc^12u%hvlW23fomy28mAqJ5:m*3TdlcF2,gUnxg+ctcS24vcb{e$vclYcanUjOu?ctu(u*u,c3u/cpn4vgo/vi04j|bsj~061K0s0p5ocd14g,dplQ3b0+1OnMb,vvpA0R0rdRnYp!nS3Rpz0_k7pWig0_nYjFodv?0_v^cddgdip|220Qn@cnnxjadk1bhdg%jphip|vXi|c$6d1gpCn#iJcDm~odc{2e0Ji;junlb|j)ne3biJjk1OuWjQe90r00nE2,0ro22`m{c9jzw2dRm{o6vtcidRlwk.hqdPpehtoWvmpkj9ly5U0Mc6vEv+wKniu{5DcO0/p#phbhp)17l!1B9=pvodcgk=vFw;k.vIh%kHdwcune1A2.0ko124o~xji?2F2~du1y15c6bMc{0_xhk3hUi@g(p{b@cR1g1{0gojb,2Zm xng%dz4@17lYg+iT1O0glSp,3Bp.f,e}6~p?2Q2Sp`wkp~pyu#pCq414v}odkRnYw}qc4,dd3mqhu8rIsvr1td5w0-7rd$enr39FtBt smlkydrpq{tdo{sV0~3;4Kr$04qk8@qm8Jqpt,qtt.kurP9lsZt69-s9s(r(ttt`65uNq.76uuu1q,y5t5t#tdumst9@rYvQ3Xq}uqyKtgt=yeuAvOy%tuuhyTsjsle2d-04000G00t!uoaY9K0Oy{03dj0F0d0U0EkX0/0+3Ri{mfjIpolEjypYyXupsyuny6uktrmCyA5qqvyDsGyFs^y/s5v1sVzau55MtGsryJtJulrszyruthm)ry020+aPygrg1jnA9jtLg+t/uya9zAua5*q{vOt4z,7EzHd:tVs;6YtY3}spz1t$tdz41jz65D0F0Dzazczej4nSc xMwhpZb{cJp5lFp7n$lIi@znzK9pzqztrW9Pt+sAyBzxsVkvz)tsz+ABm#zCsTa^aV0EzH0RzJt%n8uxy=r-zznas^rUd:z_s+AraXyIavurbhbjsXyVz;ASzQy-rptFuFuIqduJbQ05w+1Yv5nfiJnDj6g plh{kZnHxs0ruXvEjfp{ppcxdg0N000/v_msv!i?6eu|x)g^syufj~cGg.wxi;vLlhn79TAQA?3TvopMgIjT3d0,0 l2nIlAla0#lc0m17kJ00kLw.pyw?c3c?xwxLwvpXAllJv{dWl3opkcBzvhzDvPvkjoB:chB=vN9.BtdJ0H3b19iZl|0R0Iu_oenxdRAkjBAmnvx6b{g,py4@e$cbCemci`B}p:BBmIzEj}dJjKcn0{xlBpkfx*syBDy.v0B^b2y#d*r`b/j~Bg24BKBMq3stxiCyb,nE3RxhCru~y4a~sVAGs=8EySARAAuBscA-z?f8r^uv27CNARrEBEpc4_37CDBr69x,2H1j2U0L0Ow?0scF0t0:2p1Ax bOy1qgeps%yvj@yxqo5kAwzwsDA-C:a|A:sJ6NyHAO9TC.t`y79`zOAzyEAUC?q%C(r*y@ujAYrSC+z`s6As01rb8ltgrfsvrhz#6crmz(C;qqtRtFzo9pCGrpDW8TCJsVAWf8DUt}CvC`1eA104z60di=0TC9nNB+BNBn8x0Ry;r~tIs)DSkiDGz@zVtWDZC|ugyf5=A0z50R6fi^xRBvCdn%B`o+3xyXEkyLADARD`9asUAV95y_tXDYA-DD9,rHC)zBCItCAEacD~mF6FE04vC|ANt8besazNyRaCzPtOzRC*CIy;EuE*sQELDNE(ubE$a2C@E+z^t3z|zFAou7CFA,F5tvs}EtyeF1gcE-CurZs#tdD#t^yQ66Eo8Crl8xs|EuDyB@z:Fj8-t+tREXD?E=y+ulC=FIA.E{ufFnESFq27d$soFez~EYDQtizQFVA;t*tgD^DBFTuauC8@8Rr8E2FSD=ApFOzMEs8)y;DHaMaO0AFYrkE^D.DzEMEuEOn8t_u CMEQA-FofYtqE38nDAtmF=F5F@D}F9s.G6G86 aSFdyW5=E:FNu2FiENr.CKryAuF/GJGeGLzrC_EmC{t~GMs7s%bgutA+E!A-GfDF95GUtzD{E%C}3~j~uHbBA`uJ12x_0g04.
Aide

On peut résoudre le problème initial en parcourant le code au fur et à mesure. À chaque étape on fait une ou deux hypothèses (le chiffre à l'indice i est un code et/ou le couple des deux chiffres aux indices i et i + 1 est un code).

Si l'on est en train de décoder le chiffre à l'indice i on peut se demander :

  • est-ce que ce chiffre est égal à "0" ? Tous les codes débutant par "0" ("0", "01", ..., "09") sont invalides. Dans ce cas, le décodage étudié est incorrect ;
  • s'il est différent "0", on peut :
    • passer au chiffre suivant d'indice i + 1;
    • se demander si le couple des deux chiffres aux indices i et i + 1 est valide (de "10" à "26"). Dans ce cas, on peut aussi sauter un chiffre et passer à celui d'indice i + 2.

Si en effectuant ce parcours, on parvient à lire le code en entier (jusqu'à l'indice i == len(code)) alors ce décodage est valide.

On a ici décrit une approche récursive explorant les différents décodages jusqu'au cas de base que représente la fin du code. Il est aussi possible de procéder de façon itérative en « remontant » le code. On est alors certain de ne rencontrer que des décodages « valides ».


On notera enfin que différentes hypothèses (étude du chiffre à l'indice i ou du couple code[i] + code[i + 1]) peuvent amener à l'étude de la même situation. Par exemple lors de l'étude du code "123", étudier "1" puis "2" ou étudier en une fois "12" amène dans les deux cas à étudier le chiffre "3".

Les sous-problèmes sont donc interdépendants. Afin d'éviter de répéter certains calculs (« combien de chaînes peuvent être décodées à partir du caractère d'indice i=2 ?»), on pourra conserver les résultats intermédiaires.