Décoder le "Mra bs Clguba"

Un certain module de Python contient deux variables particulières : une chaîne de caractère s et un dictionnaire d dont on fournit le contenu ci-dessous :

La chaîne s
s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

On rappelle que les triples guillemets """ permettent de créer des chaînes de caractères sur plusieurs lignes.

Le dictionnaire d
d = {
    "A": "N",
    "B": "O",
    "C": "P",
    "D": "Q",
    "E": "R",
    "F": "S",
    "G": "T",
    "H": "U",
    "I": "V",
    "J": "W",
    "K": "X",
    "L": "Y",
    "M": "Z",
    "N": "A",
    "O": "B",
    "P": "C",
    "Q": "D",
    "R": "E",
    "S": "F",
    "T": "G",
    "U": "H",
    "V": "I",
    "W": "J",
    "X": "K",
    "Y": "L",
    "Z": "M",
    "a": "n",
    "b": "o",
    "c": "p",
    "d": "q",
    "e": "r",
    "f": "s",
    "g": "t",
    "h": "u",
    "i": "v",
    "j": "w",
    "k": "x",
    "l": "y",
    "m": "z",
    "n": "a",
    "o": "b",
    "p": "c",
    "q": "d",
    "r": "e",
    "s": "f",
    "t": "g",
    "u": "h",
    "v": "i",
    "w": "j",
    "x": "k",
    "y": "l",
    "z": "m",
}

L'exercice est simple : écrire la fonction decode qui prend en paramètres la chaîne s et le dictionnaire d et renvoie la chaîne de caractères décodée.

Les variables s et d sont déjà chargées dans l'éditeur. Il est inutile de les recopier.

Comment décoder ?

À vous de trouver !

###(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_èufvIy 7ZnGaïêS1me(P4C2V:jtwi]Dç[hE*)6Oo;bcdUgM/TlîàqABp!Q.rLFâ-,}=+Nzk%{95Rxé050W0w0F0q0H0$0b0l0V0$0q0b0b0`010F0H0,010406050b0g0v0v0q0:0k040t0S0$0g1m0S0o0l020q0v0,0T0l130w1w0:0)0g0w0b050!1t1v1x1z1r0,041X1(051+0!1+1-1(1r0W0H0i1e1g1i1k0M0H0Y0M0$1~0M0F1p05190U0$0w1_1h1j011}1 211 0F2729250F0U0S0W1z260:1)0F0M1e1C0b0,0q0o1k0B012b1{010h1b0w0o1K0w252z2B2G2d2J292M0v2O040a0l0y0:0S0,0S0b0H1F1H172x0:0:0w0V2-1X2Q0o1)0!2v2|0F2t2s2u0W2S1k210o2L2*251?1^1f2c360H380o2p1@250,2=1)2`2|3q1s2A1H3e2H3j0:1w0$1p0u2_3u1q3t2R3w2d3y3A1p0B3E2B3G2`35013L0q3B040d3P2{1r3S3J1k3V3X0z3!3R3u3T3*1p123-3$3/3(3U0S3z3W1p0Q3@3H3v1`3K3|3M040m3-1*3o1X3c2 0W333T0V2p2Y161@1)3n0w3p3F4a4j174r3I441k0~1p170h4a3%4y010G1p0l4E3_4G0o0h4B2?4k4L4x3f011o040x4T434V0o1p1W1Y4s4F4V4X0^3-4K4,3x4B4!3T4X0P0D3@0l4~4;4M4$1p2=1t0$190F4:423T0S1p0`594=2d0b2E0401014}4 5a3`4A040h3|5f514?040V1x0q2@0w2=5v4U2H0S4I043h5F4#5x4)3s5g1k4X4|4*3Q064 5Y505G2d5r0H4D5V2{5!5N3K1p5z0:5B0F5D0w5M5b5J5L5*045,3:4@5}5p4G5T5n5Z5Z63525y5A5C5E5}5 3`5c045e6f695x0W4^3`4X0L6p4N5/6c5?6e5Q5w2d4X0I66685R3U531V0g560q586l6G6i0{6k3q6g6u6b5;6d5^5}5X5o6G5r2=0F0g0:0o5_3`4%04546K57410!4u4q4b6{0!4e1X0F4g70312}2o2q2 0q286}4e1%4w5-1k2=0v0e0h0q0~0w0e0M0d1p1P1R1T1V0l5U3s1.3G1(0j0$0l0b000q0Y2,0l0W000g1H051Q040w1h6x0l0w0Y0Y1X7Q1e5B0M157K2B1d290l0v2p6K2a056`042v0H4)7?0/0l0R1H0,0w1E0l0$7G0h2J0V0M5D7)0o1d7N2a4j8c1C2a0y0k2v1G7V1H7k7_2B0F7w1*3G3c3T2f2022247e3T2U2L2N1p2!0t0V0:1n8t8k8m6-624p7e3r4s7?6m2d6i020Y0F0T8#8%8)0T6.4G0~6:0H1L3|6N6z5#1k5J4K626G0o6:7^5P3F1r6_4k2|8T4d4n7d0;0q1e0M0q0%387K8f6w0f2=7K154u152a1V8t1g7E0g1@8s2a5U1;4m3d4G8z2h232P6A1k8F2W2Y0C5D2+8n2B0Y1g7_6Z3s987y3s7?0#890l0n2L0l0S0h2#8l0M1G0^0l0U0k0l0#8;2#189Q06060+7S1E5(6K0l7_9@187U2v2R0g9U0k0/060N140,210V7Ja80Uaa8aac1H8;al0Han0Fah0tav7,apar0:0lat2x1L2914ah0A0SaK0w14a71daq2jas9f3vaPaw5z5?0Wah0=1g8taEaWaGaI380ba%aA2A0:0b2aa-abaY9j8c0wah1P0q0W791b2,9_4j7N0F0ba@2?0H3W7#a`1d1x2L008t2zbfbh39ae2w0F0S9@2=7laH9(0:7:bd060*569;bt0l3n5=ax3Wb8a96M1d0,6+b8ah0N2;3|1d0bbI0$34380i8a2A1i7E2K0o0F0$ag060X0o29b-aRa#2,b=b.2V0V0wa(060j1H2v2a7kc29,9.1K0U1~9x0F0k9?2=0h0ga`bA2a5?1L570H8nbv0l0Y1U1iah9%5@7Eb$34aq9,380@0@0l2B344p0h5D79b 1GcT9icK0S0U0icucn0l0G0q9_cw0Wbw2,ahbG8mbJac8tc(9_1w9_3j8tcHcYc!0Sc$6M0l2Ja_8t7Nb`1d0kd1009n0J1E88ah0|5IaTa9a.bA2Rb)5Dc/bHd11 0ldqaGa89-5?1HaVa}2R0O8M2i0Odw5Iah0j9.c8a7aQ2Xb:6Mcuau1d9f0:34cwb|9V0o9?2,00bk9@b4a7170qdMdO9(aC1Q2Lct8na87S0bc*bwd$1ad(a78tc`a9cMcx0S2pd/7Sdi2N2Qc2bk9n1G2a9;0o0~3h0Ycxbya,d:0lcK8318d+7Kbw7.ekd?2*0w0-948X1.4c6~9a1,047~837G0,800$7,7,059d0Mcl1|2j0,0b0D0!0!0h0:0/0G0Hep801?d;3|0Y0!e;ep0!9*0o0e170e8Pen257Qf0cc9/8Q7Z0v2|0q047|0N1H0i0Sax0H0l8eaH5;0W0g2@dVd45;0o0K1aco9B8w1@8y229H8C8Y9Lb/8H049Pa_fwe.2BfA9W4a9Z4s627?2$150h9m9A6#4~9vaq0q1E7(0(839d9V176+0^f*eSd$fn5?0lf;84aCf~0wf`5Y7,2+aQcM0gaJalaR0wf{18eygdaL2af.gk0H1T15g64 7,0W152%6Kf:eS8;0U8Mgqgsf+7Ggw7(gn4j1L5=ah2$2L0W1d9+gL0,f 9v212+cf210F15ah0;7v5zbS1x1m0V6K0H9Qdw2ag81G8t0E1KfBcM1i0w0}bKd1aGd029aGb`0l0:0f9U1Vah0ZfB9?g19dbT6)grbK8Mc!0$157Ig@7Gbp2@hndU7udi2ab,cob,eygS2;81a_7Ed1b!b/c2f`0/hQ9,gc0U0?1b0$1GcJh8f}ayd_b:a)5B2ag17G0vcfcy0rg$hh9jc!38aG9igWfBhD1hcMeWdr060t7$2a1T001bg?h@5;7J0L0k0IcMfl0HaGi7fqgifqa`7:d40q0K8n2/3n0S0V15170:f`0v0s2Xb.9?iv8MiF793|0W9?0wi1dw009tbKh 15c!17b:g5g07-fm8c7K000s302a0|9r0:1g0ob57_heg;0gaS0if.e6e3dB8s0l7u0lg{1wi@060A0w80i=j1j5g}iT0bd1b*b:7-i_aSi78;0vizbgcrd`aAfog2aK15dSd{1H7Ff}j31?86fn29jA9?0ViSa=fp9i1w0gi|9Wd/9rjvgAjyjAdU8njDak21j3fBjzd`jLjN8t801E0@i+9nfq2o8 a{gvb106g)gSeh7v2/3j1!0Y2a0-0li48L9r9@hYj|kdk90=fB1GbS1D1d2/30fu1dgLiFfAah1XeK98eN0i7A040yh3a74O46j#e47,8gdBgcgU298tfti$fteY7?91kx960l0xb5i(0b9db*fQ8neZ0le#0w0he%0Fe)e+0!7I2v0g0U0/gL1.9:1G6_0,l10o0!28cY0!j6l60;0H0U2}1}bdl41p0Af51G1Xfg0P7VjOfD1=fF3`9G8B9J8_2IfM2X8Ika8L8NfbenfW4c9!8W96fK6H04923Q6U4V6i6S3FlU2H5i1p5l010p6+0l0Z5;9@1d0A0$cy0U0q9?1C0l0p0ih10A0:0Ycl3@3^lAl#eQ6,0M0Y0ib#9_0i9.e`m02acy2Mk.ci0$0/416Gm5130~0V0k0i0,0iermd9,l mgcx7Nk)0}mtmvmxmn6!lPm50=l|mth4memB9nmihj0UmG0k0:0~mK3qm37f01m50ymXmQ0~0lmzmfmUmEbKm-mu0,0om00)m$93mM5j0t0km|m:mS7Xm?mj1x0hm}m 5Wn11p0=0V38e.n6mAn8mhm@0)5;e.ne3#ng04bX0o0)3j0imu9Um^9f0Y0hnu3.m45jni0:mw0o9_m{e.9.h_0q00er0h8LnP9_5;0U23gc0Y0U9,5D0oaScyaG0w0MmZnImo9Km*5j0|0kl=n)1e2L0,m9m{nD7D3|m|9.880wmxmmn`nL7r0w0waq9.cmn(0k0)cM8M9nnj86d4nC5;0Y0kofmLmp5j0cc)0:ovm!mHmwoz7D0hox0q3nm~ogm)m50C9dn;7E0o3nl.dw0}0S0i2voeiOa_0MnloYm0mG0Ym|0il?cxn,2voHn_oCn{m5l)2=aGonn@oq3|d-0:ex2Moqc2a_2=3joAd-pjl?aGcK2o1@n(9.0Eb_o{j2n,mJoT3Tm5n~o06*mDn5pt7D0}pu79erp9ppo_o/dwer0bb*nck.oGov0$n(iSaG0.m8bTnJm(pA5j0*0U0Enmm=npnaosb1pz3`pBn k|o11xij2amz0U0bm09dp=pF9d0Ood6*0YdJ790Ep*nw0C1doYmPmZ0}oyo^o`mz8eoqn+h9msn4i|9?mx00nUcIoq0inr0oqioD1pqkmDh4mY0:qp7Hqrk)9.6,0h7DqwoJqzl@m:erpJo8h`aH0U0UqGqIqKp1p-0oqpnZo!oHg?aGpmfpl?14i|8t6xn5qH6,ewcLmZ0YqDpw0l0}aqq~qlk|e.0-l%m2lP6:6o6On{lW8-4-1p100_p`8.1p5t0:rv5x0VrF8Z5{8R6TlP4X4Z8}n{0v0H3 3?rQlA4.rI1krS1p1149rWm)4`7x935YlP5rrDrZlQ0Hr=5I1p5|rM8~0U539T9X4+n{rO6t4Vr#040B40r)4_1p4{6Er.8~618^r*1p6ssb6/r~5ye#s52Hs4sn6Vr@svlV1p0{ss5.5ysC5Ssd6DrslArusJm)0osp88rEsyst1p0xrPsj605KsF016Qs!s70u3ZsS6Bsdr^1p0 r=s7s9s.04sBsMsYrHs+sG040Pror}1p3n3h8@s2rXsUs!m55ls!6inJrp1p0Ei%s!rOsmsX6/sit7m)tes!6:k7t63QrNt9s}lQs|tn641p4/s`tosEtA4`r=r:5utH6VtClYlPr_5KrLtSshlRtk1p0I0Pt0mL954v6|2|7cePb^g@2?6*9nkS6`bK5D2XkR00cYa`0:k*j21Uf=9e9g9iiT9qh+eS1a2/2/843W0Y3|2,0MiFk-k/k;2ee(e*e,nte}1nc3bg0/e`e|e=0H0!130R0#s)7ruGs)lofh0l7C7E7Gk`7KkO44gpu4une$uqk?ust*aR0/rDk70/oQe)0/c3fukJu)0:0!gf0:aneiu%0eei1x0!5/1}86t@2a0A15k(sRfgih2?jP8fhq9j0ls)mK9C7B7DiTf.1ifo2)vq7avhgv6`h79d88u7ubug0Hue7M9igYf gTa!0:15898cfwlt9DfG2gly8D3`9MfN8JlGgVlIln8SlLfY9#lO6%4Q5)tD4V8{tt4P04176`t!4Ytt4(v|tGr|n{rqv|se6!sgn{6(186+tWlTnwtctAtstA6:tir{tqscv}wjtptx6G6rv~tJv;sT04sIw2lA5%v:tXw35/r^rKr=w4tP4V5riPa`wKwHwM2HtNsRwBsNwSwX5`r`wd5+tgtZtKs-t)kyeMt.6~181a1c04.