etechblog

Jak vytvořit překladač Morseovy abecedy pomocí Pythonu

Morseova abeceda je metoda kódování zprávy pomocí teček, pomlček a mezer. Je široce používán pro tajnou komunikaci zpráv.

Možná jste viděli použití morseovy abecedy v námořních scénách mnoha filmů ke sdělování zpráv. Mluvíme zde o stejné morseovce, ale jediný rozdíl je v tom, že napíšeme program Python pro překlad z angličtiny do morseovky a naopak.

Morseova abeceda

Morseova abeceda má různé vzory pro každou anglickou abecedu, číslo, interpunkci a znaky jiné než latinky. Jakmile budete znát vzory morseovy abecedy pro různé znaky, bude snadné je zakódovat a dekódovat. Další podrobnosti a vzory najdete na stránce Morseovy abecedy na Wikipedii.

V tomto tutoriálu se naučíme, jak zakódovat prostý anglický text do morseovky a naopak. Při kódování dekódování budeme používat anglické abecedy, čísla a interpunkci. Pokud chcete přidat více typů znaků, můžete to snadno udělat, jakmile se naučíte základy kódování a dekódování.

Jedna věc k zapamatování je, že velká i malá písmena mají stejný vzor morseovy abecedy. Je to proto, že morseovka se používá hlavně pro komunikaci, která se nestará o případy abecedy, jako jsou každodenní konverzace.

Pojďme do kódovací části pro kódování a dekódování.

Z angličtiny do Morseovy abecedy

Algoritmus pro převod prostého anglického textu do morseovy abecedy je přímočarý. Pojďme zkontrolovat algoritmus.

  • Vytvořte slovník s mapováním vzorů morseovy abecedy s anglickými abecedami, čísly a interpunkcí.
  • Iterujte text a přidejte do výsledku vzor morseovy abecedy každého textového znaku.
    • Morseova abeceda obsahuje mezeru za každým znakem a dvojitou mezeru za každým slovem.
    • Když se tedy v textu setkáme s mezerou, což je oddělovač slov, musíme k výsledku přidat dvojitou mezeru.
  • Výsledný řetězec bude morseova abeceda, kterou jsme potřebovali.
  • Nakonec vraťte výsledek.
  • Zkuste napsat kód v Pythonu. Nebojte se, i když to nejste schopni napsat úplně.

    Pojďme zkontrolovat kód pro kódování prostého anglického textu do morseovky.

    # 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(
        'etechblog.cz produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.'
    )
    print(morse_code)

    Níže můžete vidět výstup morseovy abecedy. Pokud jste zprávu nezměnili, měli byste také vidět podobnou morseovku ve svém terminálu.

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

    Hurá! máme morseovku. Víš, co přijde potom.

      Jak získat bezplatné zkušební členství Course Hero

    Než se pustíme do dekódovacího programu, zastavme se na chvíli a zamysleme se nad tím, jak napsat kód pro jeho dekódování.

    Jako jeden z kroků jste měli uvažovat o obrácení slovníku CHARS_TO_MORSE_CODE_MAPPING. Ruční provádění je hektické a je třeba jej aktualizovat, kdykoli se změní původní mapování. Pojďme napsat kód pro obrácení slovníku.

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

    Výše uvedeným kódem právě obracíme páry klíč-hodnota daného slovníku. Výsledný slovník bude obsahovat hodnoty jsou nové klíče a klíče jako nové hodnoty.

    Máme všechny kousky k dekódování morseovy abecedy do prostého anglického textu. Bez dalších řečí pojďme dekódovat morseovku.

      Nástroj All-In-One Mac Maintenance Tool pro zvýšení výkonu – Macbooster

    Morseova abeceda do angličtiny

    Můžeme obrátit proces kódování morseovy abecedy, abychom získali dekódovací algoritmus. Podívejme se na algoritmus pro dekódování morseovy abecedy do prostého anglického textu.

  • Obraťte slovník CHARS_TO_MORSE_CODE_MAPPING pomocí funkce util, kterou jsme napsali.
  • Iterujte morseovu abecedu a sledujte aktuální znak morseovky.
    • Pokud narazíme na mezeru, znamená to, že máme k dekódování úplný znak morseovy abecedy.
      • Pokud je aktuální znak morseovy abecedy prázdný a máme dvě po sobě jdoucí mezery, přidejte oddělovač slov, což je jedna mezera v prostém anglickém textu.
      • Pokud je výše uvedená podmínka nepravdivá, získejte dekódovaný znak ze slovníku a přidejte jej do výsledku. Obnovte aktuální znak morseovky.
    • Pokud jsme nenarazili na mezeru, přidejte ji k aktuálnímu znaku morse.
  • Pokud existuje poslední znak, přidejte jej do výsledku po dekódování pomocí slovníku.
  • Na konci vraťte výsledek.
  • Pojďme zkontrolovat kód pro výše uvedený algoritmus.

    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)

    Dal jsem morseovu abecedu, která je generována z funkce kódování. Pokud spustíme výše uvedený program, získáme následující výstup.

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

    Poznámka: výstup je v anglické velké abecedě, protože jsme pro mapování ve slovníku použili velkou abecedu.

      Jak zálohovat e-mail na Linuxu pomocí IMAP Grab

    Závěrečná slova

    Viděli jsme, že výstup dekódovací funkce je psán velkými písmeny. Program můžete vylepšit tím, že výstup uděláte tak, jak je v daném čase, sledováním malých a velkých písmen anglické abecedy. To nesouvisí s morseovou abecedou, protože velká i malá písmena mají stejný vzor. Zkuste to, protože je zábavnější kódovat.

    To je pro tento tutoriál vše. Až příště narazíte na morseovku, použijte programy, které jsme napsali.

    Veselé kódování 👨‍💻

    Můžete se také podívat na to, jak vytvořit náhodné heslo v Pythonu.

    x