Ejercicio 5

Definir funciones para codificar y decodificar mensajes en código morse.

  1. Definir una función para codificar una palabra en código morse. Debe cumplir los siguientes requisitos:

    • Debe usarse el diccionario que se da.
    • El único parámetro de entrada de la función es una cadena con una palabra.
    • Debe devolver una cadena con el código morse correspondiente a la palabra, separando los bloques de código correspondientes a cada letra por punto y coma ;.
  2. Definir una función para decodificar una palabra en código morse. Debe cumplir los siguientes requisitos:

    • A partir del diccionario que se da se debe crear el diccionario invertido, es decir, un diccionario cuyas claves son los códigos morse y sus valores las letras correspondientes. Se valorará especialmente el uso de comprensión de diccionarios.
    • El único parámetro de entrada de la función es una cadena de código morse, donde los bloques de código correspondientes a cada letra van separados por puntos y coma ;.
    • Debe devolver una cadena con la palabra decodificada.
  3. Definir una función para codificar un mensaje en código morse. Debe cumplir los siguientes requisitos:

    • Debe usarse la función anterior para codificar palabras.
    • El único parámetro de entrada de la función es una cadena con un mensaje (palabras separadas con espacios).
    • Debe devolver una cadena con las palabras del mensaje codificadas y separadas por espacios.
    • Se valorará especialmente el uso de programación funcional.
  4. Definir una función para decodificar un mensaje en código morse. Debe cumplir los siguientes requisitos:

    • Debe usarse la función anterior para decodificar palabras.
    • El único parámetro de entrada de la función es una cadena con un mensaje en código morse (letras separadas por punto y coma, y palabras separadas con espacios).
    • Debe devolver una cadena con las palabras del mensaje decodificadas y separadas por espacios.
    • Se valorará especialmente el uso de programación funcional.

Solución


In [1]:
# Diccionario con la codificación morse
morse = {'A': '.-',     'B': '-...',   'C': '-.-.', 
         'D': '-..',    'E': '.',      'F': '..-.',
         'G': '--.',    'H': '....',   'I': '..',
         'J': '.---',   'K': '-.-',    'L': '.-..',
         'M': '--',     'N': '-.',     'O': '---',
         'P': '.--.',   'Q': '--.-',   'R': '.-.',
         'S': '...',    'T': '-',      'U': '..-',
         'V': '...-',   'W': '.--',    'X': '-..-',
         'Y': '-.--',   'Z': '--..'}


def codificar_palabra(palabra):
    """
    Función que codifica una palabra en morse.
    Parámetros:
        palabra: Una cadena con una palabra.
    Devuelve:
        El código morse correspondiente a la palabra con los bloques de código de cada letra separados por punto y coma.
    """
    # Creamos una cadena vacía para ir añadiendo las letras codificadas
    palabra_codificada = ''
    # Recorremos los caracteres de la palabra
    for i in palabra:
        # Accedemos al diccionario con la clave correspondiente al caracter y añadimos el valor (el código morse) a la palabra codificada
        palabra_codificada += morse.get(i.upper(), i) + ';' # Añadimos un punto y coma entre caracter y caracter.
    return palabra_codificada


def decodificar_palabra(palabra):
    """
    Función que decodifica una palabra en morse.
    Parámetros:
        palabra: Es una cadena con bloques de código morse separados por el caracter ;.
    Devuelve:
        La palabra decodificada.
    """

    # A partir del diccionario morse construimos otro diccionario invertido, es decir, cuyas claves sean los códigos morse y cuyos valores sean las letras asociadas.
    # Recorremos los pares del diccionario morse e invertimos las claves y los valores y devolvemos un diccionario mediante comprensión de diccionarios.
    morse_invertido = {value:key for key, value in morse.items()}
    # Creamos una cadena vacía para ir añadiendo las letras decodificadas.
    palabra_decodificada = ''
    # Dividimos el código morse por el punto y coma y recorremos la lista de códigos resultante.
    for i in palabra.split(';'):
        # Accedemos al diccionario invertido con la clave correspondiente al código morse y añadimos el valor (el caracter decodificado) a la palabra decodificada.
        palabra_decodificada += morse_invertido.get(i, i)
    return palabra_decodificada


def codificar_mensaje(mensaje):
    """
    Función que codifica un mensaje en morse.
    Parámetros:
        mensaje: Una cadena con palabras separadas por espacios.
    Devuelve:
        El código morse correspondiente al mensaje con letras separadas por punto y coma y palabras separadas por espacio.
    """
    # Creamos una cadena con un espacio para ir añadiendo las palabras codificadas.
    mensaje_codificado = ' '
    # Dividimos el mensaje de entrada por el espacio y obtenemos una lista de palabras.
    mensaje = mensaje.split()
    # Aplicamos la función codificar_palabra a cada palabra de la lista y obtenemos una lista con las palabras codificadas.
    palabras_codificadas = list(map(codificar_palabra, mensaje))
    # Concatenamos todas las palabras de la lista en una cadena separadas por un espacio.
    return mensaje_codificado.join(palabras_codificadas)


def decodificar_mensaje(mensaje):
    """
    Función que decodifica un mensaje en morse.
    Parámetros:
        mensaje: Es una cadena código morse con letras separadas por punto y coma y palabras separadas por espacio.
    Devuelve:
        El mensaje decodificado.
    """
    # Creamos una cadena con un espacio para ir añadiendo las palabras decodificadas.
    mensaje_decodificado = ' '
    # Dividimos el mensaje de entrada por el espacio y obtenemos una lista de palabras codificadas.
    mensaje = mensaje.split()
    # Aplicamos la función decodificar_palabra a cada palabra de la lista y obtenemos una lista con las palabras decodificadas.
    palabras_decodificadas = list(map(decodificar_palabra, mensaje))
    # Concatenamos todas las palabras de la lista en una cadena separadas por un espacio.
    return mensaje_decodificado.join(palabras_decodificadas)


# Llamada a las funciones de prueba
print(codificar_palabra('Python')) #Debe devolver '.--.;-.--;-;....;---;-.;'
print(decodificar_palabra('.--.;-.--;-;....;---;-.')) #Debe devolver 'PYTHON'
print(codificar_mensaje('Hola Python')) #Debe devolver '....;---;.-..;.-; .--.;-.--;-;....;---;-.'
print(decodificar_mensaje('....;---;.-..;.- .--.;-.--;-;....;---;-.')) #Debe devolver 'HOLA PYTHON'


.--.;-.--;-;....;---;-.;
PYTHON
....;---;.-..;.-; .--.;-.--;-;....;---;-.;
HOLA PYTHON

In [2]: