Escribir una función decodifica(t) tal
que dada una string t de
carácteres que representa una tabla de codificación, retorne una función
que, dada una string s, la
decodifique siguiendo la string
t.
La string t representa una
tabla que indica cómo codificar el alfabeto siguiendo un cifrado por
sustitución. Esta tabla t debe tener
exactamente
carácteres y no ha de haber ninguno repetido.
Supondremos que los textos que se quiere decodificar se escribieron,
antes de ser codificados, utilizando tan solo los carácteres
’abcdefghijklmnopqrstuvwxyz’ y el espacio. El espacio
siempre se codificará con ’_’. Así, la tabla
t codificará textos haciendo que la letra
’a’ sea t[0], la letra
’b’ sea
t[1],,
la letra ’z’ sea t[25].
Por ejemplo, haciendo:
f = decodifica(’aikvfdrzblnsqtowuepgmjcyhx’)
entonces el resultado de
f(’fpgf_fyaqft_to_fp_qmh_vbdbkbs’) debería
ser ’este examen no es muy dificil’
Hay más ejemplos en el juego de pruebas público.
La función tiene una string de tamaño como parámetro.
Si se tiene una lista de carácteres lst
y se quiere convertir a string se puede hacer con
’’.join(lst). Por ejemplo, el resultado de
hacer
’’.join([’h’,’o’,’l’,’a’,’ ’,’m’,’u’,’n’,’d’,’o’])
es ’hola mundo’
No puede usarse ningún módulo adicional.
Una vez definida la función, al probarla en el REPL de Python debería salir lo mismo que puede observar más abajo.
>>> f = decodifica("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 = decodifica("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' >>>