Jak stworzyć tłumacz alfabetu Morse’a za pomocą Pythona

Kod Morse’a to metoda kodowania wiadomości za pomocą kropek, myślników i spacji. Jest szeroko stosowany do tajnego przekazywania wiadomości.

Być może widziałeś użycie kodu Morse’a w scenach marynarki wojennej wielu filmów do przekazywania wiadomości. Mówimy tutaj o tym samym kodzie Morse’a, ale jedyną różnicą jest to, że napiszemy program w Pythonie do tłumaczenia z angielskiego na alfabet Morse’a i odwrotnie.

Kod Morse’a

Alfabet Morse’a ma różne wzorce dla każdego alfabetu angielskiego, liczby, interpunkcji i znaków innych niż łacińskie. Znając wzorce alfabetu Morse’a dla różnych znaków, łatwo będzie je zakodować i zdekodować. Możesz odwołać się do strony Wikipedii z kodem Morse’a, aby uzyskać więcej szczegółów i wzorów.

W tym samouczku dowiemy się, jak zakodować zwykły tekst w języku angielskim na kod Morse’a i na odwrót. Podczas kodowania będziemy używać angielskich alfabetów, cyfr i interpunkcji. Jeśli chcesz dodać więcej typów znaków, możesz to łatwo zrobić, gdy poznasz podstawy kodowania i dekodowania.

Jedną rzeczą do zapamiętania jest to, że zarówno wielkie, jak i małe litery mają ten sam wzór kodu Morse’a. Dzieje się tak dlatego, że alfabet Morse’a jest używany głównie do komunikacji, która nie dba o przypadki alfabetu, takie jak codzienne rozmowy.

Przejdźmy do części kodowania dotyczącej kodowania i dekodowania.

z angielskiego na alfabet Morse’a

Algorytm konwersji zwykłego tekstu angielskiego na kod Morse’a jest prosty. Sprawdźmy algorytm.

  • Utwórz słownik z mapowaniem wzorców alfabetu Morse’a z angielskimi alfabetami, cyframi i znakami interpunkcyjnymi.
  • Wykonaj iterację tekstu i dodaj do wyniku wzorzec kodu Morse’a każdego znaku tekstowego.
    • Kod Morse’a zawiera spację po każdym znaku i podwójną spację po każdym słowie.
    • Kiedy więc napotkamy w tekście spację, która jest separatorem słów, musimy dodać do wyniku podwójną spację.
  • Wynikowy ciąg będzie kodem Morse’a, którego potrzebowaliśmy.
  • Na koniec zwróć wynik.
  • Spróbuj napisać kod w Pythonie. Nie martw się, nawet jeśli nie jesteś w stanie napisać tego w całości.

    Sprawdźmy kod do kodowania zwykłego tekstu angielskiego na kod Morse’a.

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

    Poniżej możesz zobaczyć wynik kodu Morse’a. Powinieneś również zobaczyć podobny kod Morse’a w swoim terminalu, jeśli nie zmieniłeś wiadomości.

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

    Hurra! mamy kod Morse’a. Wiesz, co nastąpi później.

    Zanim przejdziemy do programu dekodującego, zatrzymajmy się na chwilę i zastanówmy, jak napisać kod, który go zdekoduje.

    Powinieneś pomyśleć o odwróceniu słownika CHARS_TO_MORSE_CODE_MAPPING jako jednym z kroków. Robienie tego ręcznie jest gorączkowe i wymaga aktualizacji po każdej zmianie oryginalnego mapowania. Napiszmy kod odwracający słownik.

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

    Po prostu odwracamy pary klucz-wartość danego słownika za pomocą powyższego kodu. Wynikowy słownik będzie zawierał wartości to nowe klucze i klucze jako nowe wartości.

    Mamy wszystkie elementy do rozszyfrowania kodu Morse’a na zwykły tekst w języku angielskim. Bez dalszych ceregieli odszyfrujmy kod Morse’a.

    Alfabet Morse’a na angielski

    Możemy odwrócić proces kodowania Morse’a, aby uzyskać algorytm dekodowania. Zobaczmy algorytm dekodowania kodu Morse’a na zwykły tekst w języku angielskim.

  • Odwróć słownik CHARS_TO_MORSE_CODE_MAPPING za pomocą funkcji util, którą napisaliśmy.
  • Iteruj po kodzie Morse’a i śledź bieżący znak alfabetu Morse’a.
    • Jeśli natkniemy się na spację, oznacza to, że mamy do rozszyfrowania cały znak alfabetu Morse’a.
      • Jeśli bieżący znak kodu Morse’a jest pusty i mamy dwie kolejne spacje, dodaj separator słowa, który jest pojedynczą spacją w zwykłym tekście angielskim.
      • Jeśli powyższy warunek jest fałszywy, pobierz zdekodowany znak ze słownika i dodaj go do wyniku. Zresetuj bieżący znak alfabetu Morse’a.
    • Jeśli nie natknęliśmy się na spację, dodaj ją do aktualnego znaku Morse’a.
  • Jeśli istnieje ostatni znak, dodaj go do wyniku po zdekodowaniu za pomocą słownika.
  • Zwróć wynik na końcu.
  • Sprawdźmy kod dla powyższego algorytmu.

    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)

    Podałem kod Morse’a, który jest generowany z funkcji kodowania. Jeśli uruchomimy powyższy program, otrzymamy następujące dane wyjściowe.

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

    Uwaga: dane wyjściowe są w alfabecie angielskim wielkimi literami, ponieważ użyliśmy wielkich liter do mapowania w słowniku.

    Ostatnie słowa

    Widzieliśmy, że dane wyjściowe funkcji dekodowania są pisane wielkimi literami. Możesz ulepszyć program, zmieniając dane wyjściowe tak, jak są w danym czasie, śledząc małe i duże litery alfabetu angielskiego. Nie jest to związane z alfabetem Morse’a, ponieważ zarówno duże, jak i małe litery mają ten sam wzorzec. Wypróbuj, ponieważ kodowanie jest przyjemniejsze.

    To wszystko w tym samouczku. Użyj programów, które napisaliśmy, gdy następnym razem napotkasz kod Morse’a.

    Szczęśliwego kodowania 👨‍💻

    Możesz również przyjrzeć się, jak utworzyć losowe hasło w Pythonie.