Како да направите преводилац Морзеовог кода користећи Питхон

Morseova azbuka predstavlja sistem kodiranja poruka korišćenjem tačaka, crtica i razmaka. Njena primena je raširena, posebno u situacijama kada je potrebno preneti poruku na diskretan način.

Mnogi su se susreli sa upotrebom Morseove azbuke u filmskim scenama sa mornarima, gde se ona koristi za komunikaciju. U ovom tekstu, reč je o istom sistemu, ali sa razlikom što ćemo kreirati Python program koji će vršiti prevod između engleskog teksta i Morseove azbuke, kao i obrnuto.

O Morseovoj azbuci

Svako slovo engleskog alfabeta, broj, interpunkcijski znak i drugi karakteri imaju specifičan obrazac u Morseovoj azbuci. Nakon što se upoznate sa ovim obrascima, kodiranje i dekodiranje će postati jednostavno. Detaljnije informacije i obrasce možete pronaći na stranici o Morseovoj azbuci na Vikipediji.

U ovom vodiču, naučićemo kako da konvertujemo običan engleski tekst u Morseovu azbuku, i obrnuto. Koristićemo engleska slova, brojeve i interpunkcijske znakove u procesu kodiranja i dekodiranja. Ako želite da uključite i druge tipove karaktera, to ćete lako moći da uradite nakon što savladate osnove ovog procesa.

Važno je napomenuti da velika i mala slova imaju iste Morseove kodove. To je zbog toga što se Morseova azbuka najčešće koristi u komunikaciji gde razlika između velikih i malih slova nije bitna, kao na primer u svakodnevnim razgovorima.

Sada, pređimo na deo sa kodiranjem za kodiranje i dekodiranje.

Pretvaranje engleskog teksta u Morseovu azbuku

Algoritam za prebacivanje engleskog teksta u Morseovu azbuku je relativno jednostavan. Pogledajmo korake:

  • Napravite rečnik koji mapira Morseove kodove sa engleskim slovima, brojevima i interpunkcijskim znacima.
  • Prođite kroz tekst i za svaki karakter dodajte odgovarajući Morseov kod u rezultat.
    • U Morseovoj azbuci, razmak se stavlja posle svakog znaka, a dvostruki razmak posle svake reči.
    • Kada naiđemo na razmak u tekstu, koji odvaja reči, u rezultat treba dodati dvostruki razmak.
  • Rezultirajući niz će biti traženi Morseov kod.
  • Na kraju, vratite rezultat.

Pokušajte da napišete kod u Pythonu. Ne brinite ako ne uspete iz prvog pokušaja.

Pogledajmo kod koji pretvara običan engleski tekst u Morseovu azbuku.

# Rečnik koji mapira karaktere u Morseovu azbuku
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': '-----',
    '.': '.-.-.-',
    ',': '--..--',
    '?': '..--..',
    '\'': '· − − − − ·',
    '!': '− · − · − −',
    '/': '− · · − ·',
    '(': '− · − − ·',
    ')': '− · − − · −',
    '&': '· − · · ·',
    ':': '− − − · · ·',
    ';': '− · − · − ·',
    '=': '− · · · −',
    '+': '· − · − ·',
    '-': '− · · · · −',
    '_': '· · − − · −',
    '"': '· − · · − ·',
    '$': '· · · − · · −',
    '@': '· − − · − ·',
}

# Funkcija za kodiranje običnog engleskog teksta u Morseovu azbuku
def to_morse_code(english_plain_text):
    morse_code=""
    for char in english_plain_text:
        # Provera da li je karakter razmak
        # Jedan razmak se dodaje posle svakog karaktera, a dupli razmak posle svake reči
        if char == ' ':
            morse_code += '  '
        else:
            # Dodavanje kodiranog Morseovog znaka u rezultat
            morse_code += CHARS_TO_MORSE_CODE_MAPPING[char.upper()] + ' '
    return morse_code

morse_code = to_morse_code(
    'techblog.co.rs produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.'
)
print(morse_code)

Možete videti izlaz u Morseovoj azbuci ispod. Trebalo bi da dobijete sličan izlaz na svom terminalu ako niste menjali poruku.

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

Bravo! Dobili smo Morseovu azbuku. Znate šta sledi.

Pre nego što pređemo na program za dekodiranje, razmislimo kako da napišemo kod za dekodiranje.

Trebalo je da razmislite o obrnutom rečniku CHARS_TO_MORSE_CODE_MAPPING kao jednom od koraka. Ručno to raditi je naporno i potrebno ga je ažurirati kad god se originalno mapiranje promeni. Hajde da napišemo kod za obrnuti rečnik.

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

Ovim kodom jednostavno zamenjujemo ključeve i vrednosti datog rečnika. Rezultirajući rečnik će imati vrednosti kao nove ključeve, a ključeve kao nove vrednosti.

Sada imamo sve potrebne delove za dekodiranje Morseove azbuke u običan engleski tekst. Bez daljeg odlaganja, hajde da dekodiramo Morseovu azbuku.

Pretvaranje Morseove azbuke u engleski tekst

Možemo obrnuti proces kodiranja Morseovog koda da bismo dobili algoritam za dekodiranje. Pogledajmo algoritam za dekodiranje Morseove azbuke u običan engleski tekst.

  • Obrnite rečnik CHARS_TO_MORSE_CODE_MAPPING koristeći funkciju koju smo napisali.
  • Iterirajte kroz Morseovu azbuku i pratite trenutni znak Morseove azbuke.
    • Kada naiđemo na razmak, to znači da imamo kompletan Morseov znak za dekodiranje.
      • Ako je trenutni znak Morseovog koda prazan i imamo dva uzastopna razmaka, dodajte separator reči, koji je jedan razmak u običnom engleskom tekstu.
      • Ako gornji uslov nije tačan, onda preuzmite dekodirani znak iz rečnika i dodajte ga rezultatu. Resetujte trenutni znak Morseove azbuke.
    • Ako nismo naišli na razmak, dodajte ga trenutnom Morseovom znaku.
  • Ako postoji poslednji znak, dodajte ga rezultatu nakon dekodiranja pomoću rečnika.
  • Na kraju vratite rezultat.

Pogledajmo kod za gornji algoritam.

def reverse_mapping(mapping):
    # Dodajte kod funkcije iz prethodnog odlomka...

CHARS_TO_MORSE_CODE_MAPPING = {} # Dodajte vrednosti rečnika
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:
        # Provera svakog karaktera
        if morse_code[i] == ' ':
            # Provera da li je reč
            if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ':
                english_plain_text += ' '
                i += 1
            else:
                # Dodavanje dekodiranog karaktera u rezultat
                english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                    current_char_morse_code]
                current_char_morse_code=""
        else:
            # Dodavanje Morseovog karaktera u trenutni karakter
            current_char_morse_code += morse_code[i]
        i += 1

    # Dodavanje poslednjeg karaktera u rezultat
    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)

Dao sam Morseov kod koji se generiše iz funkcije kodiranja. Dobićemo sledeći izlaz ako pokrenemo gornji program.

TECHBLOG.CO.RS PRODUCES HIGH-QUALITY TECHNOLOGY & FINANCE ARTICLES, MAKES TOOLS, AND APIS TO HELP BUSINESSES AND PEOPLE GROW.

Napomena: izlaz je na engleskom velikom alfabetu jer smo koristili velika slova za mapiranje u rečniku.

Završne reči

Videli smo da je izlaz funkcije za dekodiranje napisan velikim slovima. Možete poboljšati program tako što ćete napraviti izlaz kakav je u datom trenutku, prateći mala i velika slova engleskog alfabeta. Ovo nije povezano sa Morseovom azbukom, jer i velika i mala slova imaju isti obrazac. Probajte, jer je zabavnije kodirati.

To je sve za ovaj tutorijal. Koristite programe koje smo napisali kada sledeći put naiđete na Morseovu azbuku.

Srećno kodiranje 👨‍💻

Takođe možete pogledati kako da napravite slučajnu lozinku u Pythonu.