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.

      Nejlepší 5GHz WiFi kanál pro váš router [December 2020]

    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.

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

    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.

      Identifikujte USB 3.0 a nabíjecí porty podle symbolů vedle nich

    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