Cifrado César
Descripción
Podemos crear un diccionario que asocie cada letra con su índice en el alfabeto.
letters = 'abcdefghijklmnopqrstuvwxyz'
numbers = range(len(letters))
letter_map = dict(zip(letters, numbers))
En este ejemplo, el índice de ‘a’ es 0.
letter_map['a']
0
Para obtener los valores en la otra dirección (dado el índice, obtener la letra) podemos acceder a la lista numbers
por medio de índices. Por ejemplo, la letra en el índice 1, es ‘b’.
letters[1]
'b'
Podemos usar letter_map
y letters
para cifrar y descifrar palabras usando un cifrado César.
Un cifrado César es una forma de cifrado débil que involucra “desplazar” (del inglés shift) cada letra a una distancia fija en el alfabeto, y si se llega al final del alfabeto regresamos al principio. Por ejemplo, ‘a’ desplazada 2 lugares es ‘c’ y ‘z’ desplazada un lugar es ‘a’.
Escribe una función llamada shift_word
la cual tome como parámetros una cadena y un entero, y devuelva una nueva cadena que contenga las letras de la palabra desplazadas el número de lugares indicado por el entero.
Para probar tu función, confirma que “cheer” deplazado 7 lugares es “jolly” y que “melon” desplazado 16 lugares es “cubed”.
Sugerencias:
- Usa el operador módulo para que los valores que pasen de ‘z’ regresen a la ‘a’.
- Recorre las letras de la palabra, desplaza cada una, y agrega el resultado de cada desplazamiento a una lista de letras, luego usa
join
para concatenar las letras en una cadena.
Ejemplo de Ejecución:
print(shift_word("cheer", 7))
print(shift_word("melon", 16))
jolly
cubed
Solución
Mostrar solución
letters = 'abcdefghijklmnopqrstuvwxyz'
numbers = range(len(letters))
letter_map = dict(zip(letters, numbers))
def shift_word(word, by):
shifted = []
for c in word:
c_num = letter_map[c]
c_shifted = (c_num + by) % (letter_map['z'] + 1)
shifted.append(letters[c_shifted])
return ''.join(shifted)
print(shift_word("cheer", 7)) # jolly
print(shift_word("melon", 16)) # cubed
Fuente del ejercicio: https://allendowney.github.io/ThinkPython/chap11.html#id1