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
.1280133ytbIqO)N»4_7êuj:k}8s(ar5.lRàL«vU21m+ép;=cxAS,iî6fd%gç[!heG P]èowK/Cn0ED-B9{050Z0*0d0x0V0B0v0,0Q0B0x0v0v0P010d0V0N010406050v0p0K0K0x0y0c040T0:0B0p1g0:0^0,020x0K0N0O0,0C0*1q0y0g0p0*0v050?1n1p1r1t1l0N041R1Y051#0?1#1%1Y1l0Z0V0G181a1c1e0)0V0#0)0B1^0)0d1j05130e0B0*1:1b1d011@1_1{1_0d21231 0d0e0:0Z1t200y1Z0d0)181w0v0N0x0^1e0I01251=010Y150*0^1E0*1 2t2v2A272D232G0K2I040a0,0-0y0:0N0:0v0V1z1B112r0y0y0*0Q2%1R2K0^1Z0?2p2?0d2n2m2o0Z2M1e1{0^2F2!1 1-1/1926300V320^2j1.1 0N2,1Z2;2?3k1m2u1B382B3d0y1q0B1j0,0J2:3o1k3n2L3q273s3u3w0I3z2v3B2;2 013G0x3v040,0b3K2=1l3N3E1e3Q3S0,0l3W3M3o3O3$3w0z3*3Y3,3!3P0:3t3R3w0X3;3C3p1;3F3_3H3T0n3~3Z413#433{3T0u473?493^3`3%0~4f3D4h3.040J0_4m40394i440J3y1S3A3=4n4v4p0J3J4A3L4C4u3r4b3S0J3V4I3X3 3-4N1j0J3)4R3+4D4M4j4W3:4Z1!3i1R362_0Z2}3O0Q2j2S101.1Z3h0*3j3A3*054?114~4#270s1j110Y50484v0;3w5b4g4E0Y1j0^0e0m0Q0)14321Q4*5c2B1i040w5g553#1j520*5z4L275w0i0r3;0,5M0,4T3@0^1j2R0K0:3*5O5u270:1j0P5W5P4h5w0%5F3O0K0V1j4s4Z5X5h2B57040Y3_5%5Y5B040m5}5@5Z5e043b625A3P0e1j0y2v0#5E5t631e5w5y6h695l1j2P5,3@6k6r4o5C4@6u4v5I685G1e5!040L6B5-5/4q6y5v1j0i0.5L5N5(4E5S1K5V6m6C015*6L3F6b046q6X3O6t6*5Q6w116#6j6N6P5=6S2B6E5$6^5~015.4W6Q5M6_561j0V5a6}6i3P6/6g3m6~6!6-4o6%6)7e7a6,7l6n7c6;6Z6N6H3@6E0|7u4h706K7h6z1j6@3k5?696E0(6|7G741e0v2y04010_017r5w5K4Z065N7!7H6Y5R045T6W7o6Y7g7,3-7j2F7V1j6l7/6.045D7?040i7y4v7w802B7A4z7_5)7E835Z5#8a1e85727$3O5_5{0y8d7b668m0:6567796n6%6d0^6f7}7^4 6~6o6(7=7C6M5x7r7(7|8G5H7t8t6Y828P6I1j4H877D040U8p1j7x8M8e6J868B7m1j8Z8S7v8#7r8f8%7s7~7X3k7Z7#738C1j0d0:130B8!047L3A8h3@7A5;8{8}8~7a5_778m8K6x8@7.8+7p8o9m898/4h7J973L994h7P1j7S7U9r048`4B9e7#7N8n9193950L9w2=9y6T7)6V7}5+8@7(0V9O8m8?8W8H7F9H9I6R8 7{0:0p0N23959Q3T9K9k6:9E9X9(3F767}9*9x9K6E6G9t9T8L9 6=049~9o7%a1a86`1ja77M6~9%af6+9s9d9,9f699h78am7a8D3b0d8z8J6w9;9?9E7 ai8b04020B0d0O9$6J0I469E9G4Jat8}9`90923R9O9^9S3r6U5U9WaE9qay7IakaR8Ua28g7!a!9Ua-9}a/9!9Ea39Ra58caK5 9Ma%7Y8|au6Y5_2,0d0p0y0^9ja,7+ap6s1jae3L9K9ba_7Y1R5D2?4|2?4.1R0d4:bD2{2@2i2k2_0x224}4-4`1X546Y2,0K0m0Y0x0s0*0m0)0b1j1J1L1N1P0,aW2=1!3B1Y0@0*1a0,0N0*1y0,1n0y4|0^0Z2,0,1q0V170Q120,0*0R0*0y0Q0Vc8b}246d0K0/320,0D2r1F0dcd0,23c70)1K3b170v0M2u8w0d0,110p0Rb}0:1p12170Z2v170p1B0#6d0Ncx0,3_0V2F0d0M0Ab:bR0@1A2#0Z0M2X0^172Fca0Y0Yc9232r2)514@3O291`1|1~bS3O9A7R0I4yaT9D3m0?by0A0,b?c|24b`b|0o2`24c.5o770Y0y0McG24c~2)3@d12b1}2J7a7A4)ddby0,bX0$c,b-c)050p0B3B1{1Z5Dd01|dCd49Kd7012y9#b701d$0Jdc98b56F8md,d.a46~a6d=7Qd%d@b4d_a?d*d$0nd~2?dJ2Zbi5OdWdAdYd3dE69d$0}0S0S0}0+e5bx4@04aQ0?dU1ldUdy24ec2aeed53@d$d(d*d`e2d|4ye5a*aLald/6~eDeKd:eNd^7ae3endeepb_9:0yeac eyd22cef6Yeh0=eleXbyeret05eveb4hdBeAd#d|eEa;8Qe1f1d6eIeRe0d;eH9B4Gf77aeGf4eCd|e450eY53e!e9ewdXeze+eB9zd|ei0Eemfke=1Re@e_e(e{edfse~9Bd9fda=f9fgfufbfLf2fNeOeVe fR3OfffUegfie;eZe8e$fpe)dZe,f59B0Hekfy4*fl4}e?0VdTf{f+fFfrdDft4veDd-d)fOg3eIf0f!fSeTd fV9Bfjf@e7e#e%dzf e*g1fI7R0Hfxf%53c(esf{1l0?dRb;04b?cOdsc/c#b,dLdNdl0Gc#0,dnc3aBcd3h0Mc$b,4?cMdwcwcyc;0,3R1a0^cF0Z0pcKcMcFf~4ve|fHePe daghdIeZ0xg.0vcL2Rg;e`g?fGgpg_9Bgu4}cGcQcu24cU0xcWex0V0|111c9:0vgw1+1$1Z0x3O0#dZ2i0R2zcP130|0d0cb`1e0V1q6fhB0xhD0;0V0Z2p1eg 91hMhDcxd3hT1y5!0,0)2,0Y1ehhhj0A0v0G0#hW0xhm1P0Q0|2Z2#2%1e2i2dcL1 hJ0#g(aO1e0+cVcx2z3@hU1wd318gI0y2z0vceh+i90*h.h:2zhPhR0)1e0z0_0!1 0?0xbzgC0{hechh,cx0U185pb+g/h3g(fne$gV0Vb+2d24b^h10p0v0|5o0x0Wcn4?2+1P2Zc12vcFg dj0,2,0v13g+co0,gSb ducs0ydg0f0Bcai^g(iZ2#e!1c0VbNcG00260:cfcti$iMh1g:i{0B003b1-chg-b_bUc!e$0Q1r0x2.0/c3i@i_g,heb^i$i(243b2$0V3R240rhfiNc92)c.cDcF1Pi:hocfdvcpjpjrcgdxh52Bg@h8azahab016{8=6J9c4 f^8YjTjmiO0Zjf2+1.0M24j)jqc1j,glexgnf-g2a+a:bo9ub6j@dG7rj_9Y7;bk9E8Abs9.aakk8XaJg}gvdP1Y0E3_0viMjp1Aj5cFh|0pdvb~0,cSjUcF15kMja2#jd2)2u1cctcpkTk1c90G0:c63bb}0VdO1(3BgBeuf{c{4|5.jjjAjCc32)iXhpi#5pjLkX1-c^gHi`c}j.27j:d!h97R7TfzeZf`f|049:k;jT4?aG248k0KdvhndwcIjvcycdc7l00djDb,0w0vjqj4cbc6cs0ikXkTdW0G3RhQ240wc#c3g=j/h7ligf7R4rhb3Tc9l%lgl)f.fhfJ0Xl.0igwe@gAdSbR0h1Bhvdq1@c^du2*2,2.1KgOc{dWj9kKm30,2`9:0GdvlUcx5.1B2R2Gldh0h2l:lf1?l?kha0kjkwfekmkz84j{lmfmi;k+h4fEh6g0l*9pb1j@kqj@8D7kmH8N8I9Y7qaImK4}hr3Bh(gC0Ehvh11x2%jv2Y2!k7b_1rlu0ycFjJl7cnl;mzmRl@6v9/9|kChcl3hv2D1BgN0y17c{c.0e1ydg0SiK0xiMgVhi24kL0vdp1K2v2)lMkWj!kYjcnkexc,hQgHe$melHlJcug.cpc8kVkbchlrcvlBcJjz6dl1b,1x17cpjY0Ve$dzc9j+chgY2RkS3p4@dg0Tk=9:0ViJkL4?c;hQnP1NlNca0RlQ24hUi/n^iKg$c42Fodn/nUjsk8cukaomk;bhmn1B8wi49=iZcuk.1B0wlrcHcJov17oxnjoAlskLhv1xnZiKdsi@l|kE04m2m^0Q0/2)5qj90qiZo6k9n;j-mPl(n6mB5 mUm!6DmGmE69bugieZ1Nk=nEc81xk=juk}jx18nOl2g.5Dm,1lm.bRj30,nt2$j7jbnFk!dk2X0Q0M11n.lw0xdMou0M0Qbi2#gNcacT1rcPi`2`jBny17du1naOhN17jgj%pQlCo+cOgXp8b,c.0qcpgV0p1-0M177Xhs36fqgomS6Y2Ooi2R1j0S0N3hjhcXdupzni1.24pIlW15g*kNe9nYpV50bA3 3l4 by9K5_597r655O9Y5j045l5n5p3b1PaDm%n97do?8^8.g7kio=o_fS9^btmJ9EqCgb3-bmkpo^b/6~0s0Q1j0j1AqzqGaq8_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+bO0?4.m11B3dj0hvb+iJpGc712cs0,nh2#kLp pAq2iJb^0Fc40M5Un-240kkXjN1glXcBobgN0Qg!kdp/kgr@j`71o|gv0,0`1B0*c^12u%hvlW23fomy28mAqJ5:m*3TdlcF2,gUnxg+ctcS24vcb{e$vclYcanUjOu?ctu(u*u,c3u/cpn4vgo/vi04j|bsj~061K0N0o5ocd14g,dplQ3b0#1OnMb,vvpA0,0^dRnYp!nS3Rpz0Bk7pWig0BnYjFodv?0Bv^cddgdip|220/n@cnnxjadk1bhdg%jphip|vXi|c$6d1gpCn#iJcDm~odc{2e0*i;junlb|j)ne3biJjk1OuWjQe90^00nE2,0^o22`m{c9jzw2dRm{o6vtcidRlwk.hqdPpehtoWvmpkj9ly5U0yc6vEv+wKniu{5DcO0Mp#phbhp)17l!1B9=pvodcgk=vFw;k.vIh%kHdwcune1A2.0Vo124o~xji?2F2~du1y15c6bMc{0Bxhk3hUi@g(p{b@cR1g1{0vojb,2Zm xng%dz4@17lYg+iT1O0vlSp,3Bp.f,e}6~p?2Q2Sp`wkp~pyu#pCq414v}odkRnYw}qc4,dd3mqhu8rIsvr1td5w0 7rd$enr39FtBt smlkydrpq{tdo{sV0t3;4Kr$04qk8@qm8Jqpt,qtt.kurP9lsZt69-s9s(r(ttt`65uNq.76uuu1q,y5t5t#tdumst9@rYvQ3Xq}uqyKtgt=yeuAvOy%tuuhyTsjsle2d-04000_00t!uoaY9K0Qy{03dj0%0J0r0.kX0M0#3Ri{mfjIpolEjypYyXupsyuny6uktrmCyA5qqvyDsGyFs^y/s5v1sVzau55MtGsryJtJulrszyruthm)ry020#aPygrg1jnA9jtLg+t/uya9zAua5*q{vOt4z,7EzHd:tVs;6YtY3}spz1t$tdz41jz65D0%0Izazczej4nSc xMwhpZb{cJp5lFp7n$lIi@znzK9pzqztrW9Pt+sAyBzxsVkvz)tsz+ABm#zCsTa^aV0.zH0,zJt%n8uxy=r-zznas^rUd:z_s+AraXyIavurbhbjsXyVz;ASzQy-rptFuFuIqduJbQ05w+1Yv5nfiJnDj6g plh{kZnHxs0^uXvEjfp{ppcxdg0E000Mv_msv!i?6eu|x)g^syufj~cGg.wxi;vLlhn79TAQA?3TvopMgIjT3d0K0el2nIlAla0Ylc0d17kJ00kLw.pyw?c3c?xwxLwvpXAllJv{dWl3opkcBzvhzDvPvkjoB:chB=vN9.BtdJ0w3b19iZl|0,0Su_oenxdRAkjBAmnvx6b{g,py4@e$cbCemci`B}p:BBmIzEj}dJjKcn0ZxlBpkfx*syBDy.v0B^b2y#d*r`b/j~Bg24BKBMq3stxiCyb,nE3RxhCru~y4a~sVAGs=8EySARAAuBscA-z?f8r^uv27CNARrEBEpc4_37CDBr69x,2H1j2U0T0Qw?0NcF0-0c2p1Ax bOy1qgeps%yvj@yxqo5kAwzwsDA-C:a|A:sJ6NyHAO9TC.t`y79`zOAzyEAUC?q%C(r*y@ujAYrSC+z`s6As01rb8ltgrfsvrhz#6crmz(C;qqtRtFzo9pCGrpDW8TCJsVAWf8DUt}CvC`1eA104z60Ji=0xC9nNB+BNBn8x0,y;r~tIs)DSkiDGz@zVtWDZC|ugyf5=A0z50,6fi^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;DHaMaO0OFYrkE^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_0v04.
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.