En este artículo vamos a trabajar con el manejo de cadenas de texto, listas y operación de módulo para codificar y decodificar un mensaje.
El codificar un mensaje consiste en la transformación de un tipo de información a otra, sin que en el proceso de transformación se pierda información. Para conocer el contenido del mensaje codificado, se requiere de un código para poder traducirlo a su estado original, es así que si no se cuenta con el código es imposible (o muy difícil) saber lo que dice el mensaje.
En este ejemplo, la codificación del mensaje consiste en intercambiar las letras originales del mensaje por otras de acuerdo con un valor de intercambio. Por ejemplo:
Para este ejemplo requerimos del mensaje y de un código para realizar la codificación de dicho mensaje. En este caso el código que se va a utilizar será una letra del alfabeto en mayúscula o minúscula, para recuperar su índice de posición en la definición del alfabeto y con este valor realizar el intercambio.
Es importante tener en cuenta que tanto para la codificación como para la decodificación, se debe utilizar el mismo código de lo contrario no se va a poder recuperar el mensaje original.
La definición del alfabeto consiste en una lista de las letras de la a a la z primero en minúsculas, seguidas de las mismas letras en mayúsculas, como se muestra a continuación:
# Definimos la letras del alfabeto
alphabet = "abcdefghijklmnñopqrstuvwxyz"
# Definimos el alfabeto que cnsiste en una lista de las letras
# En orden de la a a la z primero en minúsculas
# concatenamos el espacio en blanco a la lista
# y luego agregamos la letras mayúsculas
alphabet = [c for c in alphabet] + [" "] + [c.upper() for c in alphabet]
Es decir, tendríamos una estructura similar a la siguiente:
| Índice | Letra |
|---|---|
| 0 | a |
| 1 | b |
| 2 | c |
| 3 | d |
| 4 | e |
| 5 | f |
| 6 | g |
| 7 | h |
| 8 | i |
| 9 | j |
| 10 | k |
| 11 | l |
| 12 | m |
| 13 | n |
| 14 | ñ |
| 15 | o |
| 16 | p |
| 17 | q |
| 18 | r |
| 19 | s |
| 20 | t |
| 21 | u |
| 22 | v |
| 23 | w |
| 24 | x |
| 25 | y |
| 26 | z |
| 27 | |
| 28 | A |
| 29 | B |
| 30 | C |
| 31 | D |
| 32 | E |
| 33 | F |
| 34 | G |
| 35 | H |
| 36 | I |
| 37 | J |
| 38 | K |
| 39 | L |
| 40 | M |
| 41 | N |
| 42 | Ñ |
| 43 | O |
| 44 | P |
| 45 | Q |
| 46 | R |
| 47 | S |
| 48 | T |
| 49 | U |
| 50 | V |
| 51 | W |
| 52 | X |
| 53 | Y |
| 54 | Z |
Con el alfabeto definido, podemos comenzar a realizar nuestro algoritmo de codificación, para lo cual definiremos una función que nos permita recuperar el índice de la letra que se va a utilizar como código:
def getIndex(encodeChar):
# Recuperamos el índice de la letra de el alfabeto definido
index = alphabet.index(encodeChar)
# Retornamos el índice si es diferente de 0 caso contrario retornamos el valor de 21
return index if index else 21
Esta función nos permite recuperar el índice de la letra ingresada o el valor por defecto, en este caso 21, cuando el índice sea 0, caso contrario no se realizaría ningún cambio.
Ahora vamos a definir la función de codificación, la cual va a recibir el mensaje que el usuario quiere codificar y la letra que se va a usar como código.
def encode(message, encodeChar):
# Definimos una variable para almacenar el mensaje codificado
newMessage = ""
# Recuperamos el índice de la letra para la codificación
# haciendo uso de la función antes definida
index = getIndex(encodeChar)
# Iteramos el mensaje recibido para trabajar caracter por caracter
for x in message:
# Recuperamos el índice de cada caracter del mensaje
y = alphabet.index(x)
# Realizamos el cálculo del índice de la nueva letra
# Sumamos el valor del índice de cambio al de la letra actual
# Luego calculamos el módulo para que no sobrepase la longitud del alfabeto
y = (y + index) % len(alphabet)
# Obtenemos la nueva letra con el índice calculado
char = alphabet[y]
# Concatenamos la nueva letra al mensaje codificado
newMessage = newMessage + char
# Imprimimos el mensaje codificado
print(newMessage)
Con esta función, podemos entonces realizar la codificación del mensaje, realizando intercambios de letras de acuerdo con el código recibido. Ahora vamos a definir la función de decodificación, para transformar un mensaje codificado al mensaje original, para lo cual realizamos el mismo proceso, cambiando únicamente el cálculo del índice de la letra del mensaje original, para lo cual en lugar de sumar el índice del código lo restamos.
def encode(message, encodeChar):
# Definimos una variable para almacenar el mensaje codificado
newMessage = ""
# Recuperamos el índice de la letra para la codificación
# haciendo uso de la función antes definida
index = getIndex(encodeChar)
# Iteramos el mensaje recibido para trabajar caracter por caracter
for x in message:
# Recuperamos el índice de cada caracter del mensaje
y = alphabet.index(x)
# Realizamos el cálculo del índice de la nueva letra (original)
# Restamos el valor del índice de cambio al de la letra actual
# Luego calculamos el módulo para que no sobrepase la longitud del alfabeto
y = (y - index) % len(alphabet)
# Obtenemos la nueva letra con el índice calculado
char = alphabet[y]
# Concatenamos la nueva letra al mensaje codificado
newMessage = newMessage + char
# Imprimimos el mensaje decodificado
print(newMessage)
Asumiendo que tenemos el mensaje “Fragmentos Python”, e ingresamos la letra e como código para la codificación, de respuesta tendríamos el siguiente mensaje:
JvekpiqxswDTBxlsq
Esto, considerando que la letra e que usamos como código, tiene el valor de índice 4 en la lista del alfabeto, el cual cuenta con 55 elementos, entonces el proceso de transformación se realiza de la siguiente manera:
| Letra original | Índice original | Letra codificada | Índice codificado |
|---|---|---|---|
| F | 33 | J | 37 |
| r | 18 | v | 22 |
| a | 0 | e | 4 |
| g | 6 | k | 10 |
| m | 12 | p | 16 |
| e | 4 | i | 8 |
| n | 13 | q | 17 |
| t | 20 | x | 24 |
| o | 15 | s | 19 |
| s | 19 | w | 23 |
| 27 | D | 31 | |
| P | 44 | T | 48 |
| y | 25 | B | 29 |
| t | 20 | x | 24 |
| h | 7 | l | 11 |
| o | 15 | s | 19 |
| n | 13 | q | 17 |
Para hacer dinámico nuestro codificador, vamos a definir dos funciones más, la primera para leer el mensaje y el código para que el usuario pueda ingresarlos por teclado, y una función principal que mostrará un menú con las opciones de codificar y decodificar.
Para la lectura de datos, definimos la siguiente función:
def getData():
message = input("Enter your message: ")
encodeChar = input(f"Enter the encode character ([a-z] or [A-Z]): ")
if not encodeChar or len(encodeChar) > 1:
while not encodeChar or len(encodeChar) > 1:
encodeChar = input(f"Enter the encode character ([a-z] or [A-Z]): ")
return message, encodeChar
Ahora para ejecutar el programa y presentar el menú definimos la función main como se muestra a continuación:
def main():
repeat = True
# Realizamos la ejecución de manera indefinida
# hasta que el usuario decida finalizarla
while repeat:
# Presentamos las opciones del menú
print("1) Encode message")
print("2) Decode message")
print("0) Exit")
# Recuperamos la opción seleccionada por el usuario
# validando que sea una opción correcta
try:
option = int(input("Select your option: "))
except:
option = -1
# De acuerdo a la opción seleccionada
# realizamos la actividad de codificar o decodificar
if option == 1:
word, num = getData()
encode(word, num)
elif option == 2:
word, num = getData()
decode(word, num)
elif option == 0:
repeat = False
else:
print("Choose a correct option")
Un ejemplo de la codificación del mensaje “Fragmentos Python” se vería de la siguiente manera:
1) Encode message
2) Decode message
0) Exit
Select your option: 1
Enter your message: Fragmentos Python
Enter the encode character ([a-z] or [A-Z]): e
JvekpiqxswDTBxlsq
Así mismo, un ejemplo de la decodificación del mensaje anterior se vería de la siguiente manera:
1) Encode message
2) Decode message
0) Exit
Select your option: 2
Enter your message: JvekpiqxswDTBxlsq
Enter the encode character ([a-z] or [A-Z]): e
Fragmentos Python
Y esta es una manera práctica y sencilla de codificar mensajes, utilizando la técnica de intercambio de letras.

No hay comentarios.:
Publicar un comentario