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

Probar solución en Google Colab

Fuente del ejercicio: https://allendowney.github.io/ThinkPython/chap11.html#id1