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.
Table of Contents
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.
- 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.
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.
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.
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.
- 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.
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.
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.