Come creare un traduttore di codice Morse usando Python

Il codice Morse è un metodo per codificare un messaggio utilizzando punti, trattini e spazi. È ampiamente utilizzato per comunicare messaggi in segreto.

Potresti aver visto l’uso del codice morse nelle scene della marina di molti film per comunicare messaggi. Stiamo parlando dello stesso codice Morse qui, ma l’unica differenza è che scriveremo un programma Python per tradurre dall’inglese al codice Morse e viceversa.

codice Morse

Il codice Morse ha modelli diversi per ogni alfabeto inglese, numero, punteggiatura e caratteri non latini. Una volta che conosci i modelli di codice Morse per caratteri diversi, sarà facile codificarli e decodificarli. Puoi fare riferimento alla pagina Wikipedia del codice morse per maggiori dettagli e schemi.

In questo tutorial impareremo come codificare un semplice testo inglese in codice morse e viceversa. Utilizzeremo alfabeti, numeri e punteggiatura inglesi durante la codifica della decodifica. Se vuoi aggiungere più tipi di caratteri, puoi farlo facilmente una volta apprese le basi della codifica e della decodifica.

Una cosa da ricordare è che sia l’alfabeto maiuscolo che quello minuscolo hanno lo stesso schema di codice morse. Questo perché il codice morse viene utilizzato principalmente per la comunicazione a cui non interessano le lettere dell’alfabeto come le conversazioni quotidiane.

Entriamo nella parte di codifica per la codifica e la decodifica.

Da inglese a codice Morse

L’algoritmo per convertire il semplice testo inglese in codice Morse è semplice. Controlliamo l’algoritmo.

  • Crea un dizionario con le mappature dei modelli di codice Morse con alfabeti, numeri e segni di punteggiatura inglesi.
  • Scorri il testo e aggiungi il modello di codice Morse di ogni carattere di testo al risultato.
    • Il codice Morse contiene uno spazio dopo ogni carattere e un doppio spazio dopo ogni parola.
    • Quindi, quando incontriamo spazio nel testo, che è il separatore per le parole, dobbiamo aggiungere doppio spazio al risultato.
  • La stringa risultante sarà il codice morse di cui avevamo bisogno.
  • Infine, restituisci il risultato.
  • Prova a scrivere il codice in Python. Non preoccuparti, anche se non sei in grado di scriverlo completamente.

    Controlliamo il codice per la codifica del testo in inglese semplice in codice morse.

    # dictionary for mapping characters to morse code
    CHARS_TO_MORSE_CODE_MAPPING = {
        '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': '--..',
        '1': '.----',
        '2': '..---',
        '3': '...--',
        '4': '....-',
        '5': '.....',
        '6': '-....',
        '7': '--...',
        '8': '---..',
        '9': '----.',
        '0': '-----',
        '.': '.-.-.-',
        ',': '--..--',
        '?': '..--..',
        ''': '· − − − − ·',
        '!': '− · − · − −',
        '/': '− · · − ·',
        '(': '− · − − ·',
        ')': '− · − − · −',
        '&': '· − · · ·',
        ':': '− − − · · ·',
        ';': '− · − · − ·',
        '=': '− · · · −',
        '+': '· − · − ·',
        '-': '− · · · · −',
        '_': '· · − − · −',
        '"': '· − · · − ·',
        '$': '· · · − · · −',
        '@': '· − − · − ·',
    }
    
    # function to encode plain English text to morse code
    def to_morse_code(english_plain_text):
        morse_code=""
        for char in english_plain_text:
            # checking for space
            # to add single space after every character and double space after every word
            if char == ' ':
                morse_code += '  '
            else:
                # adding encoded morse code to the result
                morse_code += CHARS_TO_MORSE_CODE_MAPPING[char.upper()] + ' '
        return morse_code
    
    morse_code = to_morse_code(
        'winadmin.it produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.'
    )
    print(morse_code)

    Puoi vedere l’output del codice Morse di seguito. Dovresti anche vedere un codice Morse simile nel tuo terminale se non hai cambiato il messaggio.

    --. . . -.- ..-. .-.. .- .-. .   .--. .-. --- -.. ..- -.-. . ...   .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.--   - . -.-. .... -. --- .-.. --- --. -.--   · − · · ·   ..-. .. -. .- -. -.-. .   .- .-. - .. -.-. .-.. . ... --..--   -- .- -.- . ...   - --- --- .-.. ... --..--   .- -. -..   .- .--. .. ...   - ---   .... . .-.. .--.   -... ..- ... .. -. . ... ... . ...   .- -. -..   .--. . --- .--. .-.. .   --. .-. --- .-- .-.-.-

    Evviva! abbiamo il codice morse. Sai cosa viene dopo.

    Prima di buttarci nel programma di decodifica, fermiamoci un attimo e pensiamo a come scrivere il codice per decodificarlo.

    Avresti dovuto pensare di invertire il dizionario CHARS_TO_MORSE_CODE_MAPPING come uno dei passaggi. Farlo manualmente è frenetico e deve essere aggiornato ogni volta che viene modificata la mappatura originale. Scriviamo il codice per invertire il dizionario.

    def reverse_mapping(mapping):
        reversed = {}
        for key, value in mapping.items():
            reversed[value] = key
        return reversed

    Stiamo semplicemente invertendo le coppie chiave-valore del dato dizionario con il codice sopra. Il dizionario risultante conterrà i valori sono nuove chiavi e le chiavi come nuovi valori.

    Abbiamo tutti i pezzi per decodificare il codice morse in un semplice testo inglese. Senza ulteriori indugi, decodifichiamo il codice morse.

    Codice Morse in inglese

    Possiamo invertire il processo di codifica del codice morse per ottenere l’algoritmo di decodifica. Vediamo l’algoritmo per decodificare il codice morse in un semplice testo inglese.

  • Invertire il dizionario CHARS_TO_MORSE_CODE_MAPPING usando la funzione util che abbiamo scritto.
  • Esegui l’iterazione sul codice morse e tieni traccia del carattere del codice morse corrente.
    • Se incontriamo uno spazio, significa che abbiamo un carattere di codice morse completo da decodificare.
      • Se il carattere del codice morse corrente è vuoto e abbiamo due spazi consecutivi, aggiungi un separatore di parole che è un singolo spazio in un testo inglese semplice.
      • Se la condizione precedente è falsa, prendi il carattere decodificato dal dizionario e aggiungilo al risultato. Reimposta il carattere del codice Morse corrente.
    • Se non abbiamo incontrato lo spazio, aggiungilo al carattere morse corrente.
  • Se c’è l’ultimo carattere, aggiungilo al risultato dopo la decodifica usando il dizionario.
  • Restituisci il risultato alla fine.
  • Controlliamo il codice per l’algoritmo sopra.

    def reverse_mapping(mapping):
        # add function code from the previous snippet...
    
    CHARS_TO_MORSE_CODE_MAPPING = {} # add dictionary values 
    MORSE_CODE_TO_CHARS_MAPPING = reverse_mapping(CHARS_TO_MORSE_CODE_MAPPING)
    
    def to_english_plain_text(morse_code):
        english_plain_text=""
    
        current_char_morse_code=""
        i = 0
        while i < len(morse_code) - 1:
            # checking for each character
            if morse_code[i] == ' ':
                # checking for word
                if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ':
                    english_plain_text += ' '
                    i += 1
                else:
                    # adding decoded character to the result
                    english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                        current_char_morse_code]
                    current_char_morse_code=""
            else:
                # adding morse code char to the current character
                current_char_morse_code += morse_code[i]
            i += 1
    
        # adding last character to the result
        if len(current_char_morse_code) > 0:
            english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                current_char_morse_code]
    
        return english_plain_text
    
    english_plain_text = to_english_plain_text(
        '--. . . -.- ..-. .-.. .- .-. .   .--. .-. --- -.. ..- -.-. . ...   .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.--   - . -.-. .... -. --- .-.. --- --. -.--   · − · · ·   ..-. .. -. .- -. -.-. .   .- .-. - .. -.-. .-.. . ... --..--   -- .- -.- . ...   - --- --- .-.. ... --..--   .- -. -..   .- .--. .. ...   - ---   .... . .-.. .--.   -... ..- ... .. -. . ... ... . ...   .- -. -..   .--. . --- .--. .-.. .   --. .-. --- .-- .-.-.- '
    )
    print(english_plain_text)

    Ho fornito il codice morse generato dalla funzione di codifica. Otterremo il seguente output se eseguiamo il programma sopra.

    winadmin.it PRODUCES HIGH-QUALITY TECHNOLOGY & FINANCE ARTICLES, MAKES TOOLS, AND APIS TO HELP BUSINESSES AND PEOPLE GROW.

    Nota: l’output è nell’alfabeto maiuscolo inglese perché abbiamo usato l’alfabeto maiuscolo per la mappatura nel dizionario.

    Parole finali

    Abbiamo visto che l’output della funzione di decodifica è in maiuscolo. Puoi migliorare il programma facendo in modo che l’output sia così com’è nel tempo indicato tracciando le lettere minuscole e maiuscole dell’alfabeto inglese. Questo non è correlato al codice morse, poiché sia ​​le maiuscole che le minuscole hanno lo stesso schema. Provalo, perché è più divertente programmare.

    Questo è tutto per questo tutorial. Usa i programmi che abbiamo scritto quando incontri il codice morse la prossima volta.

    Buona codifica 👨‍💻

    Puoi anche vedere come creare una password casuale in Python.