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

Morseova abeceda představuje systém kódování zpráv pomocí kombinace teček, pomlček a mezer. Je často využívaná pro důvěrnou výměnu informací.

Pravděpodobně jste se s morseovou abecedou setkali ve filmových scénách, kde námořníci komunikují pomocí blikajících světel. V tomto případě se jedná o stejný princip, avšak my si vytvoříme program v Pythonu, který zajistí překlad mezi anglickým textem a morseovou abecedou a naopak.

Morseova abeceda

Každé písmeno, číslice, interpunkční znaménko a speciální symbol má v morseově abecedě unikátní vzor. Jakmile se tyto vzory naučíte, kódování a dekódování zpráv se stane jednoduchým procesem. Pro více informací a detailní přehled vzorů doporučujeme navštívit stránku o morseově abecedě na Wikipedii.

V tomto návodu si ukážeme, jak transformovat běžný anglický text do morseovy abecedy a také zpět. Pro naše kódování a dekódování budeme používat anglická písmena, čísla a interpunkční znaménka. Pokud byste chtěli přidat další znaky, po zvládnutí základů to bude snadné.

Je důležité si uvědomit, že velká a malá písmena mají v morseově abecedě stejný vzor. Je to z toho důvodu, že morseova abeceda slouží především pro komunikaci, kde se nerozlišuje velikost písmen, stejně jako v běžných rozhovorech.

Nyní se můžeme pustit do programování, které nám umožní kódovat a dekódovat.

Převod z angličtiny do morseovy abecedy

Algoritmus pro transformaci textu z angličtiny do morseovy abecedy je poměrně jednoduchý. Následuje jeho rozpis:

  • Vytvořte slovník, který bude obsahovat přiřazení mezi anglickými znaky (písmena, čísla, interpunkce) a jejich vzory v morseově abecedě.
  • Projděte text znak po znaku a ke každému znaku přidejte odpovídající vzor morseovy abecedy do výsledného řetězce.
    • Morseova abeceda používá mezeru za každým znakem a dvojitou mezeru pro oddělení slov.
    • Pokud tedy v textu narazíte na mezeru, která odděluje slova, přidejte do výsledku dvojitou mezeru.
  • Výsledný řetězec bude obsahovat text v morseově abecedě.
  • Nakonec vraťte tento výsledný řetězec.

Zkuste si napsat kód v Pythonu. Nemusíte se obávat, pokud se vám to napoprvé nepovede.

Nyní se podívejme na kód pro převod anglického textu do morseovy abecedy.

# slovník pro mapování znaků na morseovu abecedu
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': '-----',
    '.': '.-.-.-',
    ',': '--..--',
    '?': '..--..',
    '\'': '· − − − − ·',
    '!': '− · − · − −',
    '/': '− · · − ·',
    '(': '− · − − ·',
    ')': '− · − − · −',
    '&': '· − · · ·',
    ':': '− − − · · ·',
    ';': '− · − · − ·',
    '=': '− · · · −',
    '+': '· − · − ·',
    '-': '− · · · · −',
    '_': '· · − − · −',
    '"': '· − · · − ·',
    '$': '· · · − · · −',
    '@': '· − − · − ·',
}

# funkce pro kódování anglického textu do morseovy abecedy
def to_morse_code(english_plain_text):
    morse_code=""
    for char in english_plain_text:
        # kontrola mezery
        # přidání jedné mezery za každý znak a dvou mezer za každé slovo
        if char == ' ':
            morse_code += '  '
        else:
            # přidání zakódované morseovy abecedy do výsledku
            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 je zobrazen výstup v morseově abecedě. Pokud jste text nezměnili, měl by se výstup ve vašem terminálu shodovat.

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

Výborně! Máme text v morseově abecedě. Tušíte, co následuje?

Než se pustíme do dekódování, zastavme se na chvíli a zamysleme se nad tím, jak napsat kód pro zpětný převod.

Jedním z kroků je obrácení slovníku CHARS_TO_MORSE_CODE_MAPPING. Ruční provádění je však zdlouhavé a vyžaduje aktualizaci při každé změně původního mapování. Proto si napíšeme kód, který slovník obrátí automaticky.

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

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

Nyní máme vše potřebné pro dekódování morseovy abecedy do běžného anglického textu. Pojďme se bez dalšího zdržování pustit do dekódování.

Převod z morseovy abecedy do angličtiny

Proces kódování morseovy abecedy můžeme obrátit, abychom získali algoritmus pro dekódování. Podívejme se na algoritmus, který dekóduje morseovu abecedu do běžného anglického textu:

  • Obrátíme slovník CHARS_TO_MORSE_CODE_MAPPING pomocí pomocné funkce, kterou jsme si napsali.
  • Procházíme morseovu abecedu a sledujeme aktuální znak morseovky.
    • Pokud narazíme na mezeru, znamená to, že máme k dispozici kompletní znak v morseově abecedě.
      • Pokud je aktuální znak prázdný a za sebou jsou dvě mezery, přidáme oddělovač slov, tedy jednu mezeru v anglickém textu.
      • Pokud výše uvedená podmínka neplatí, získáme dekódovaný znak ze slovníku a přidáme ho do výsledku. Poté vymažeme aktuální znak morseovky.
    • Pokud jsme nenarazili na mezeru, přidáme znak k aktuálnímu znaku v morseovce.
  • Pokud zbývá nějaký poslední znak, přidáme ho do výsledku po dekódování pomocí slovníku.
  • Nakonec vrátíme výsledný anglický text.

Podívejme se na kód pro výše uvedený algoritmus.

def reverse_mapping(mapping):
    # zde se vkládá kód funkce z předchozího úryvku...

CHARS_TO_MORSE_CODE_MAPPING = {} # zde se vkládají hodnoty ze slovníku
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:
        # kontrola každého znaku
        if morse_code[i] == ' ':
            # kontrola slova
            if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ':
                english_plain_text += ' '
                i += 1
            else:
                # přidání dekódovaného znaku do výsledku
                english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                    current_char_morse_code]
                current_char_morse_code=""
        else:
            # přidání znaku z morseovy abecedy k aktuálnímu znaku
            current_char_morse_code += morse_code[i]
        i += 1

    # přidání posledního znaku do výsledku
    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)
  

Vložil jsem morseovu abecedu vygenerovanou funkcí kódování. Pokud spustíme výše uvedený program, dostaneme 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 napsaný velkými písmeny, protože pro mapování ve slovníku jsme použili velká písmena.

Závěrem

Vidíme, že výstup z dekódovací funkce je velkými písmeny. Program můžeme vylepšit tak, aby výstup zachovával původní velikost písmen zadaného textu. To ale není spojené s morseovou abecedou, jelikož velká a malá písmena mají stejný vzor. Můžete si to vyzkoušet, je to zábavné programování.

To je pro tento návod vše. Až příště narazíte na morseovu abecedu, využijte programy, které jsme si napsali.

Hezké programování 👨‍💻

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