Escriure una funció descodifica(t) tal
que donada una string t de
caràcters que representa una taula de codificació, retorni una funció
que, donada una string s, la
descodifiqui seguint la string
t.
La string t representa una
taula que indica com codificar l’alfabet seguint un xifrat de
substitució. Aquesta taula t ha de
tenir exactament
caràcters i no n’ha d’haver cap de repetit.
Suposarem que els textos que volem descodificar es van escriure,
abans de ser codificats, fent servir només els caràcters
’abcdefghijklmnopqrstuvwxyz’ i l’espai. L’espai sempre el
codificarem amb ’_’. Així, la taula
t codificarà textos fent que la lletra
’a’ sigui t[0], la lletra
’b’ sigui
t[1],,
la lletra ’z’ sigui
t[25].
Per exemple, si fem:
f = descodifica(’aikvfdrzblnsqtowuepgmjcyhx’)
aleshores el resultat de
f(’aumfpg_fyaqft_to_fp_rabef_vbdbkbs’) ha
de ser
’aquest examen no es gaire dificil’
Veieu més exemples en els jocs de proves públics.
La funció té una string de mida com a paràmetre.
Si teniu una llista de caràcters lst i
la voleu convertir a string ho podeu fer amb
’’.join(lst). Per exemple, el resultat de
fer
’’.join([’h’,’o’,’l’,’a’,’ ’,’m’,’ó’,’n’])
és ’hola món’
No podeu fer servir cap mòdul addicional.
Un cop definida la funció, en provar-la al REPL de Python us hauria de sortir el mateix que podeu observar més avall.
>>> f = descodifica("bcdefghijklmnopqrstuvwxyza") >>> f('cfxbsf_pg_cvht_jo_uif_bcpwf_dpef') 'beware of bugs in the above code' >>> f('j_ibwf_pomz_qspwfe_ju_dpssfdu') 'i have only proved it correct' >>> f('opu_usjfe_ju') 'not tried it' >>> >>> # la taula de codificació poden ser caràcters que no siguin lletres >>> # la tabla de codificación puede contener carácteres que no sean letras >>> >>> f = descodifica("52-!813467/09*+.[();?`]<:>") >>> f('5_3++!_305))_6*_;48_26)4+.)_4+);80_6*_;48_!8`60)_)85;') 'a good glass in the bishops hostel in the devils seat' >>> f(';]8*;:_+*8_!83(88)_5*!_;46(;88*_96*?;8)') 'twenty one degrees and thirteen minutes' >>> f('*+(;485);_5*!_2:_*+(;4') 'northeast and by north' >>> f('956*_2(5*-4_)8`8*;4_0692_85);_)6!8') 'main branch seventh limb east side' >>> f(')4++;_1(+9_;48_081;_8:8_+1_;48_!85;4)_485!') 'shoot from the left eye of the deaths head' >>> f('5_288_06*8_1(+9_;48_;(88_;4(+?34_;48_)4+;_161;:_188;_+?;') 'a bee line from the tree through the shot fifty feet out' >>>