Codage téléphonique

Certains claviers de téléphones, virtuels ou « physiques », associent à chaque touche des caractères comme illustré sur la figure ci-dessous :

Codage téléphonique

Il est ainsi possible d'encoder un message sous la forme d'un nombre. Toutefois, le message ne doit être constitué que de caractères alphabétiques, écrits en minuscule et non accentués. Il est aussi possible de représenter l'espace en utilisant le numéro 0. Dans toute la suite, on désignera par caractères valides ces caractères utilisables dans les messages.

Ce codage permet donc d'écrire le message "bonjour le monde" sous la forme du nombre 2665687053066633.

On souhaite utiliser cette méthode afin d'encoder et de décoder des messages.

1. Représenter le codage

On décide de représenter le codage illustré plus haut par un dictionnaire Python associant à chaque caractère valide, l'entier qui lui correspond.

Ce dictionnaire sera nommé CARACTERE_CHIFFRE et contiendra tous les caractères valides (lettres en minuscules et non accentuées, espace). On aura donc CARACTERE_CHIFFRE["a"] = 2 et CARACTERE_CHIFFRE[" "] = 0.

Compléter le dictionnaire CARACTERE_CHIFFRE.

Exemples
>>> CARACTERE_CHIFFRE["a"]
2
>>> CARACTERE_CHIFFRE[" "]
0

###(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

.128013sH3o_8bcdufvgIx/T0lyq n7AapSr1FmeR,P2=4C:}jtwzki95hE{6050j0H0S0A0W0t0b0w0i0t0A0b0b0M010S0W0B010406050b0k0G0G0A0D0u040C0e0t0k0`0e0x050q111315170 0B041g1n051q0q1q1s1n0 0j0W0m0/0;0?0^0Z0W0n0Z0t1G0Z0S0}050*0h0t0H1B0=0@011F1H1J1H0S1P1R1N0S0h0e0j171O0D1o0S0Z0/1a0b0B0A0x0^0L011T1D010l0,0H0x0A0G0H1N1^1`1 1V221R25270}0a0w0K0D0e0B0e0b0W1d0x0w0(1?0D0D0H0i2s1g2a0x1o0q1;2F0S1/1.1:0j2c0^1J0x242p1N1y1A0:1U2P0W2R0x1+1z1N0B2y1o2D2F2-101_2t2X202$0D140t0}0w0E2C2;0~2:2b2?1V2^2`2|0L2 1`312D2O01360A2{040w0d3a2E0 3d340^3g3i0w0N3m3c2;3e3s2|0Y3w3o3y3q3f0e2_3h2|0$3D322=1C353I373j0y3N3p3Q3r3S3K3j0g3W3F3Y3H3J3t0X3(333*3A040E0s3/3P2Y3+3T0E2~1h303E3:3{3=0E39403b423`2@3!3i0E3l483n3O3z4d0}0E3v4h3x434c3,4m3C4p4a4k4t3?3M4w4j3G453V4C3X444l3?3%4H3)4J4z0E3.4N4r3R4z0L3^4T4b4V3T0L3 2-4x4E4K0L474)4D3;4,4g4/4I4s4$4o4@4O4_3#0L4v4|4U3Z4W4B524!544$4G574y4$4M5c4+4W4S2/1t2+1g2V2I0j2M3e0i1+281o5o1r5m5k2/5t0(2,4}350}0O0z0I0z0O0r0!0I0!0f0O0c0o0F0F5P3w0w4:3{0e0}0M5Y5!200|040#3D0w5:5Z4^1V0b1}04010A013w5*1V5,0P5)5?0^0G0W0}4.305 0^5,0J5/5;6b015^0}010h5}4p6h61635F656704693b6p0}6e4w5;5=6s6i5_010i6n2/64016q4p6D530166685~6L6d6f5:6h6j5`0j6J6a6V0}626O6h6S044?6(6E6W6B6g6L6!01286U6=6*6r6Q6.6:6x6)046A4)6C6Z6G0l6%746~046+2-6P586R6u732E6y766X7j3e6`0n7d7o757h307s3G6.4{6;6Q6?786^6E6`0Z7w5E7G6 6,6L7D6}7P7q6@6Y6_6G677U7k6N7i6-6u7E7e7V7741797Z6k0R7N7p7z3b7B3*6.517F7%6z7r7a6k0V7^7y707k7~7$3e7H7:7J6Q6`2{8c3G7(7A7*0}7 7-817W7I7Y7K6G0G877f7`2E7|3{6.56808d827X8D206`0x8z7V8B3j8o048G8r8I8t8f8v8h6G5$8k3*8m7{8T8V7x7f7/497;8w6k0|8(3{8*8C8T5b8H8l8J8u8L5@6G0v8P8s8R936t0}8~8W908Y8;8g7k6`0D978X998}8_5+918Z9a6F6k0b9m9f9o7S6u9d8.7.837=5`1M9q607Q7)9B0}5f8 8)9s9h8!9j6G0k9y9S7g893e6.9Q9e9!8:3n8=8#6k0m9Z8`9M8n9O049)9E8s9,0~9.9W6k0T9=9r9#7R6E6.5j9R9?9g9-9i7t6G0pa49La69Na86uaa9*ac9~06a0ag6k0uaj6c9@8+9_ap9|8Xasau3G6`0Uay6MaA8|aC9Kazad9 afaI6G0waL8{8S9_4Y6K8/3_8X0Q3N0q5C0H2F2*a/5n1z5p2I2K2G1*1,2I0A1Qa=0q5o0 b20)0+0-04.
2. Encoder un message

On fournit le dictionnaire CARACTERE_CHIFFRE décrit dans la question précédente. Ce dictionnaire est déjà chargé dans l'éditeur.

Écrire la fonction encode qui prend en paramètre une chaîne de caractères message non vide et renvoie le nombre la représentant.

On garantit que message ne contient que des caractères valides.

Exemples
>>> encode("voleur")
865387
>>> encode("volets")
865387
>>> encode("bonjour le monde")
2665687053066633

###(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

.128013sH3o_bcdufvgI/T0ly nAapSr1FmeR(P2=4:+Ctwki][5hE*)050i0D0N0w0Q0r0b0t0h0r0w0b0b0I010N0Q0x010406050b0j0C0C0w0z0s040y0e0r0j0=0e0u050o0|0~10120`0x041b1i051l0o1l1n1i0`0i0Q0l0*0,0.0:0U0Q0m0U0r1B0U0N0^050#0g0r0D1w0-0/011A1C1E1C0N1K1M1I0N0g0e0i121J0z1j0N0U0*150b0x0w0u0:0H011O1y010k0%0D0u0w0C0D1I1:1=1`1Q1}1M20220^0a0t0G0z0e0x0e0b0Q180u0t0Z1.0z0z0D0h2n1b250u1j0o1,2A0N1*1)1+0i270:1E0u1 2k1I1t1v0+1P2K0Q2M0u1$1u1I0x2t1j2y2A2(0{1;2o2S1{2X0z0 0r0^0A2x2,0_2+262.1Q2:2=0^0H2_1=2{2y2J01300w2?040d342z0`372~0:3a3c0J3f362,383l0^0T3o1k2$1b2Q2D0i2H380h1$231j3z1m3x2*1c2`053E0Z2%3q3j010P0^0Z0k3v3i1x1Q0O0^0t3Z3S3#3k0k0^1 3P0D3*2}3,010@040F3?2-3^0u0^220.0w0m3=3M352|3~2T3_0^0X0K3o060t4i3)3!4b40042t0|0r0#0N3o4k3+4b0e0^0I4u49380C0Q0^0q4g4j4v3@4b3V040k0e0z4B4l2/0^0h100w2v0D2t4S4w1{0e3%042V4$4L4U04420b44462*4T1Q3`4f473g4J4J4C3T4n4p0j4r0w4t4}044K4a4(4z4-5c2 0^5456582(5b384y040W5f4D4F040A4H595n3T5p0L5s520^0M0v0E0v0M0p0V0E0V0f0M0c0n0B0B5N3}383`0S5W5E044W0z4Y0N4!4@3N4_0:3`0R4I4j513^4N2t0N0j0z1a5y5@4m5i0D4q4s4g1b3;2A2#0D2A3I2B3B1b2E2D1#1%2D0w1L6b3y1u2{0o0Z0#0%0b04.
Aide

Le code représentant le message "abeille" est égal à 10 fois celui représentant le message "abeill" augmenté du code représentant "e".

3.1 Décoder un nombre (str)

type(code) is str

Dans cette question, on représente les codes sous forme de chaînes de caractères.

L'opération inverse est plus problématique : en effet, les nombres 2 à 9 correspondent chacun à plusieurs caractères.

Le même code peut donc être interprété comme plusieurs messages distincts. C'est le cas par exemple du code "865387" qui représente, entre autres, les messages "voleur" et "volets".

On fournit le dictionnaire CHIFFRE_CARACTERE = {"0": " ", "2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"} qui associe à chaque chiffre valide, les caractères représentés. Le chiffre "1" ne représente aucun caractère ce qui explique qu'il n'apparaisse pas dans le dictionnaire.

Écrire la fonction decode qui prend en paramètre un code valide et renvoie la liste des chaînes de caractères représentées par cet entier.

On garantit que le code passé en paramètre compte moins de 5 chiffres valides et ne contient aucun chiffre "1" (qui ne représente aucun caractère valide).

La liste renvoyée pourra contenir des messages dans n'importe quel ordre : les tests compareront les versions triées des différentes listes.

Exemples
>>> decode("6")
['m', 'n', 'o']
>>> # ['n', 'o', 'm'] serait aussi accepté
>>> decode("58")
['jt', 'ju', 'jv', 'kt', 'ku', 'kv', 'lt', 'lu', 'lv']

###(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

.128013sH3_8ufvIy n7aS1me(P24C:twi][hE)6o;bcdg/T0lqAp!.rFL-,=+k95Rxé050M0s0z0o0B0R0b0l0L0R0o0b0b0$010z0B0U010406050b0g0r0r0o0X0k040p0I0R0g110I0m0l020o0r0U0J0l0+0s1b0X0S0g0s0b050O181a1c1e160U041C1J051M0O1M1O1J160M0B0i0_0{0}0 0E0B0N0E0R1$0E0z14050;0K0R0s1X0|0~011#1%1)1%0z1/1;1-0z0K0I0M1e1.0X1K0z0E0_1h0b0U0o0m0 0v011?1Z010h0?0s0m1p0s1-2e2g2l1^2o1;2r0r2t040a0l0u0X0I0U0I0b0B1k1m0/2c0X0X0s0L2O1C2v0m1K0O2a2!0z2827290M2x0 1)0m2q2L1-1U1W0`1@2.0B2:0m241V1-0U2T1K2Y2!35172f1m2_2m2~0X1b0R140l0q2X3915382w3b1^3d3f3h0v3k2g3m2Y2-013r0o3g040l0d3v2Z163y3p0 3B3D0l0w3H3x393z3N3h0*3R3J3T3L3A0I3e3C3h0H3Y3n3a1Y3q3%3s3E0n3,3K3/3M3;3)3E0f3^3!3`3$3(3O0)403o423V040q0Q473.2`433=0q3j1D3l3Z484g4a0q3u4l3w1L331C2@2%0M2+3z0L242D0.1V1K320s343l3R054D0/4L4o2m0(140/0h4N3_4g0A3h4Y414p0h4V2U4E4%4S1^13040t4.4f3c144P0s4@3z4;0G0y3Y0l530l3-3U142T180R0;0z1B4t2Z554Z2m0I140$3R5h4(2m4;0D0C5254563#0m140U2p5n5w425k045m5f3E5D4g5r4?5I5K2m0r0B144d5O5i4:140#5C5W0 0b2j0401014}3#4 5t5I06545o4/0 4U040A1#1;5!5p3q0K142A5,424;5N375#3A5z5B5V5 0 4 5~5@015F0V5H355?4^1^5R5T645L14515:5=5=5P3q140B6t5q5Y6h6p3M142C0}0o0N4|5I6o3z5F6m3l6R5x6b5}6d6i5F0W6E6B042K0U6(6f140t0G5u6y6W425_0B4X6Q6A6J046D6|696T6U3w6@4p6104636!6I01666-6a044{7f4 6w355;6?6y6}7g590g5b0o5d7f6$7f5y040o0U0U2q0M7j6/7z6K1A0b6N6P686e7d146;6x7o7q5_0s0@7O4M694;7l4m7o7p697A0L1#0h0h2T6H6S5l7?6X7h4-7b4~140D7J6 7H045/7m7*6z695_0h3%7_494`1c0o2V0s7=717Q0I4#6 0m8d4p140x0c0j0Y0Y0+0F0e0x0T0+0T0x0P0F8z83807}7`7.6`7;7!4u7$140C7(3w7n877+7Q7A5A6Z7P6#146%8M8e7B7D7F830t677#8#6C8r5j140%8{6q5S4b835Z8l6i7A6L7M6O8 0 5F8~957c7-8g8i8k8)7c4 7T865v89580:0g0X8q9f57047s7u7w5:1C4{2!4J2!4y1C0z4A9K2)2#23252%0o1:4K4x4H1I4R7c2T0r0e0h0o0(0s0e0E0d141u1w1y1A0l8W2Z1L3m1J0Z0o2R2T2V0B1l0l322J2L0-1=0L0B0!0/0}0I0g0^0o0M2J0z1=0{0l0b1h1ja21m0o0i2U0l0g2:a42p8,1S1N040Z007Ca57.1=0X0-0L9u2Mav0l1A0za42I2K0ba80_abadapag9@9`1T1V3z1`1(1*1,4I4w375O9F7W4+6{9l3z8o558-4)4+7ib16F4=81b4a}5-7S9^15887Q5_4W7fa 7z4*7B0g0,8=b87|ba656G9x7`70bt6u04946n7q977L7N83506=8!6i6_a|6VbE8`bw5E5l745gbE787abzb68@8S8_7{0/bIbd8Y87bQ9z1A7t5c5eb!1^7yb56)aI8;b{6.b7b 7g98bHc26g7U6?a`047Y0b8R9_8T04b,8Z53b/8O7:9kbP727^bS8sb)ce9Z7~048Lb^6~by8^6i4;857)cjca8b0X9b7g0L9ialco757q8n6C9wbD7,8t8v8x8z8B8D8F8H8Jc67 b87/8Q838VbKcj764_bnbpc,c1cAcNbscD9mbvcXb(cCcScq049ed46i6r92c|bC6Vc^6)c49acs8|d9cM9h0X8hcQcv7qc79pckcYb:5ab?cM6TcM5rcG8Xbf96140obobqc27-d0b%cEd3cp7Qdd5Uc~4;dgd77Q5%145*bIbKca2T0z9ucWdVdKdAb=7vb@4m9E4E9G4w0O4y16e00:0=0@04.
Aide (1)

On pourra utiliser :

  • soit une fonction récursive prenant en paramètres le code, l'indice du chiffre à lire dans celui-ci et un message en cours de construction ;
  • soit approche itérative utilisant une pile contenant des couples (indice du chiffre à lire dans le code, message).
Aide (2)

Quelle que soit l'approche choisie, un message est entièrement construit lorsque l'indice du chiffre à lire est égal à la longueur du code.

On l'ajoute alors une liste de résultats.

Aide (3)

Dans le cas où l'indice du chiffre à lire est strictement inférieur à la longueur du code, on lit ce chiffre.

On ajoute alors chaque caractère qui lui est associé au message et, pour chaque message ainsi construit :

  1. (approche récursive) on lance un appel récursif avec comme paramètres le code, l'indice suivant et le nouveau message ;
  2. (approche itérative) on empile le couple formé de l'indice suivant et de ce nouveau message.

Dans le cas de la pile, le traitement est terminé lorsque la pile est vide.

3.2 Décoder un nombre (int)

type(code) is int

Dans cette question, on représente les codes sous forme de nombres entiers.

L'opération inverse est plus problématique : en effet, les chiffres de 2 à 9 correspondent chacun à plusieurs caractères.

Le même code peut donc être interprété comme plusieurs messages distincts. C'est le cas par exemple du nombre 865387 qui représente, entre autres, les messages "voleur" et "volets".

On fournit la liste CHIFFRE_CARACTERE = [" ", None, "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"] qui associe à chaque numéro/indice, les caractères représentés. Le nombre 1 ne représente aucun caractère ce qui explique que l'on ait CHIFFRE_CARACTERE[1] = None.

Écrire la fonction decode qui prend en paramètre un entier 0 < code < 10**4 et renvoie la liste des chaînes de caractères représentées par cet entier.

On garantit que le code passé en paramètre est strictement positif et ne contient aucun chiffre 1 (qui ne représente aucun caractère valide).

La liste renvoyée pourra contenir des messages dans n'importe quel ordre : les tests compareront les versions triées des différentes listes.

Exemples
>>> decode(6)
['m', 'n', 'o']
>>> # ['n', 'o', 'm'] serait aussi accepté
>>> decode(58)
['jt', 'ju', 'jv', 'kt', 'ku', 'kv', 'lt', 'lu', 'lv']

###(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

.128013sH3_8èufvIy n7aS1me(P24C:jtwi][hE)6Oo;bcdg/T0lqAp!.rFL-,=+zk%95Rxé050P0t0B0p0D0U0b0m0O0U0p0b0b0)010B0D0X010406050b0h0s0s0p0!0l040q0L0U0h160L0n0m020p0s0X0M0m0:0t1g0!0V0h0t0b050R1d1f1h1j1b0X041H1O051R0R1R1T1O1b0P0D0j0~1012140G0D0Q0G0U1+0G0B19050_0N0U0t1$1113011*1,1.1,0B1@1_1=0B0N0L0P1j1?0!1P0B0G0~1m0b0X0p0n140w011{1(010i0{0t0n1u0t1=2j2l2q1}2t1_2w0s2y040a0m0v0!0L0X0L0b0D1p1r0@2h0!0!0t0O2T1H2A0n1P0R2f2)0B2d2c2e0P2C141.0n2v2Q1=1Z1#0 1|2?0D2^0n291!1=0X2Y1P2%2)3a1c2k1r2~2r330!1g0U190m0r2$3e1a3d2B3g1}3i3k3m0w3p2l3r2%2=013w0p3l040m0d3A2(1b3D3u143G3I0m0x3M3C3e3E3S3m0/3W3O3Y3Q3F0L3j3H3m0J3%3s3f1%3v3,3x3J0o3;3P3@3R3_3.3J0f3}3)3 3+3-3T0.453t473!040r0T4c3?2 483`0r3o1I3q3(4d4l4f0r3z4q3B4s4k3h413I0r3L4y2(1Q381H2|2,0P2:3E0O292I0?1!1P370t393q3W054R0@4Z4t2r0,190@0i4#3~4l0C3m4:464u0i4-2Z4S4^4*1}18040u4 4B3v194%0t553E520I0z3%0m5h0m3=3Z192Y1d0U0_0B1G4H3J5k3*0L190)3W5j4;2r520F0E5g5i5v4e190X2u5A5J4l5x045z5t5B4_5D190F545t5P3h584~5#5C51190(5O5+140b2o0401015b3*5d5G5t065i5V50144,040C1*1_5/5W3v0N192F5`47525!3c5:3F5L5N5*6a145d6962015R0Y5T3a6156140s0D194i6o6t525f5~60605$5704596f4l525.5U6N3R192H120p0Q5a6V6k5R6x3q6z5l045M686G6A6u190Z6R5%6/2O6`5,530I5H6L6-3*640D4/6(6p6l6P5)6y6W6@5S6+3B74476C6E6~6q196J3a5 736L7f0n5m1F0h5p0p5r7o7g6_6=6.0p0X0X2v0P7E6h7E7x046Z0b6#6%6j7a6r6K7u7f640t0|7W4!6k6I727u5h7w190h0n2S1F6s6?6*7`6.6Q796t5R0-7}3*7m4g6F7s7/6M6k7R1Z0+0`2^5s7e6)5y845K7c0@8m5Q190R0R8q2r864h7.7/7$190i3,8v6O0O1h0p2!0t2Y8F140L4?04318N7b0y0c0k0#0#0:0H0e0y0W0:0W0y0S0H8!7O5Y7Q7=7@0B7_7H5{190E7r4r8a7#8c6m6;7X816^8;047J7L0n7N8_6g190u6i7+7a8d0D8f318^946?6T8T7R8H0!8J8@8M807{190*9s6Y1F7U6$8/040I717!7:6k642Y0B0h0!0n9D045n7A5q8i4r1H592)4X2)4M1H0B4O9,2.2*282a2,0p1^4Y4L4V1N4)6?2Y0s0e0i0p0,0t0e0G0d191z1B1D1F0m8}3B1Q3r1O0$0p2W2Y2!0D1q0m372O2Q0=1`0O0D0%0@120L0h0}0p0P2O8@0m100m0b1m1oaq1r0p0j2Z0m7?1`6:0t7G1X1S040$00992N0O0G1`0!0=0O9S2RaT0m1F0Bas2N2P0baw0~azaBaNaEafai1Y1!3E1 1-1/1;4W4K3c5#9%8B044.7E8Q5j9d4`4|7 9p5c9f97bs9i6H195e7.bjblbp2rbn7Q4{980h0;9I9hah918o7*bP7Y5-9V7T7V9IbB9M7v9O19779Vbx7j7f6*7i2(7k4l8688by9q7q8z909j7y5o9Z7E5R7Gbt3*7R997MbN97bX9HbF6 9L89b|6t7%7)9Iag3N8 9Nb}047?7^9!b,8k5Sb*7d6,b-19839z3E8xb@4zcob;6{8e8g9ocAcwb/5ubQb+b:cB048t8TcGb{73bj8D0!b*8I8K9y8j7a8Pb(9UcEc5198V8X8Z8#8%8)8+8-0H9I0F97cs8@cu4I7,8{cm1acJ8bcq0pbLc9cd6Xbk9lcNd79~bu046Uc.6t9tc+9xbScVcw9Cc?8ncbdydp8`9JbCbQ9X7B7DdC8rcxdO5X045FdJdfdhdj017PdY9tczbTbzdr8T5=195^bZdVci7y9R9T9VdLc05~9$4S9(4K0R4M9}0K1r339xam2v2t1rad0~0^aJa*0La,1`2^as8L2Ha`2k0}2V0Q0=2Y0!0(a^1r0U000=5qev1_2h2V4$4Sb91/211:2z7ab?4#0R9%0Z0m0y00a_0m0n0=2l0s0L310}a}2R9_ew0m0p0AaD0_0na`aWaM3,161`2l16ay0Xa 0P0g0}eD0P0=0N1o0maB0m8D0nap1q0}6Ja#2|eI20bc36bf4!bhd}bD0t78c447bHd#bJ0@cUdG9e53bwd%d8bU9Jdb7tcpd;8RfucPcqfBcK1}b.cZ6D04cHfHd)fK8Ab%9W0^9Sc=dtb_dT7Ed,5@0m5_dY525}cgfM9A040Zf 5AfT140O0r1903aM0h7^f91`aLfcfef,9#eQfr1Ud e14L0^0`0|04.
Aide (1)

On pourra utiliser :

  • soit une fonction récursive prenant en paramètres le code et un message en cours de construction
  • soit une pile contenant des couples (code, message).
Aide (2)

Quelle que soit l'approche choisie, un message est entièrement construit lorsque le code envisagé est nul.

On l'ajoute alors une liste de résultats.

Aide (3)

Dans le cas où le code est non nul, on extrait son nombre des unités et celui des dizaines.

On ajoute alors chaque caractère associé au chiffre des unités au message et, pour chaque message ainsi construit :

  1. (approche récursive) on lance un appel récursif avec comme paramètres le nombre de dizaines et ce nouveau message ;
  2. (approche avec une pile) on empile le couple formé du nombre de dizaines et de ce nouveau message.

Dans le cas de la pile, le traitement est terminé lorsque la pile est vide.