Азбука Морзе: Посібник з кодування та декодування на Python
Азбука Морзе – це спосіб передачі інформації за допомогою комбінацій крапок, тире та пробілів. Цей метод часто застосовується для кодування повідомлень, особливо для їхнього таємного передавання.
Можливо, ви стикалися з використанням азбуки Морзе у фільмах, де її застосовували для зв’язку на морі. У цій статті ми розглянемо той самий принцип азбуки Морзе, але з єдиною відмінністю – ми створимо програму на Python, яка дозволить нам перекладати з англійської мови на азбуку Морзе та навпаки.
Що таке азбука Морзе?
Азбука Морзе використовує унікальні комбінації для кожного символу англійського алфавіту, цифр, знаків пунктуації, а також деяких нелатинських символів. Після вивчення цих шаблонів, кодування і декодування стає досить простим процесом. Для детальнішого ознайомлення із шаблонами різних символів, можна звернутися до сторінки азбуки Морзе у Вікіпедії.
У цьому посібнику ми навчимося перетворювати звичайний англійський текст в азбуку Морзе та у зворотному напрямку. Для прикладу ми будемо використовувати англійські літери, цифри та основні знаки пунктуації. Якщо ви захочете розширити перелік символів, це буде легко зробити після вивчення базових принципів кодування та декодування.
Важливо пам’ятати, що великі та малі літери мають ідентичні відповідності в азбуці Морзе. Це зумовлено тим, що азбука Морзе призначена насамперед для передачі змісту, а не для точного відтворення регістру символів, подібно до звичайного спілкування.
Перейдемо до практичної частини – кодування та декодування повідомлень.
Перетворення з англійської мови на азбуку Морзе
Алгоритм перетворення звичайного англійського тексту в азбуку Морзе є досить прямолінійним. Розглянемо його:
- Створіть словник, де кожному символу англійської абетки, цифрі та знаку пунктуації буде відповідати певний код азбуки Морзе.
- Пройдіть текст посимвольно і додавайте до результату відповідний код азбуки Морзе для кожного символу.
- Згідно з правилами азбуки Морзе, після кожного символу ставиться один пробіл, а після кожного слова – два пробіли.
- Отже, коли зустрічаємо у тексті пробіл, який є роздільником для слів, додаємо подвійний пробіл до результату.
- Отриманий рядок і буде закодованим повідомленням в азбуці Морзе.
- Поверніть отриманий результат.
Спробуйте написати відповідний код на Python. Не хвилюйтеся, якщо не вдасться зробити це самостійно.
Розглянемо приклад коду для кодування простого англійського тексту в азбуку Морзе:
# словник відповідностей між символами та кодом Морзе 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': '-----', '.': '.-.-.-', ',': '--..--', '?': '..--..', '\'': '· − − − − ·', '!': '− · − · − −', '/': '− · · − ·', '(': '− · − − ·', ')': '− · − − · −', '&': '· − · · ·', ':': '− − − · · ·', ';': '− · − · − ·', '=': '− · · · −', '+': '· − · − ·', '-': '− · · · · −', '_': '· · − − · −', '"': '· − · · − ·', '$': '· · · − · · −', '@': '· − − · − ·', } # функція для кодування звичайного тексту в азбуку Морзе def to_morse_code(english_plain_text): morse_code="" for char in english_plain_text: # перевірка пробілу # додаємо один пробіл після символу та два після слова if char == ' ': morse_code += ' ' else: # додаємо закодований символ у азбуці Морзе до результату morse_code += CHARS_TO_MORSE_CODE_MAPPING[char.upper()] + ' ' return morse_code morse_code = to_morse_code( 'techukraine.net produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.' ) print(morse_code)
Результат кодування:
--. . . -.- ..-. .-.. .- .-. . .--. .-. --- -.. ..- -.-. . ... .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.-- - . -.-. .... -. --- .-.. --- --. -.-- · − · · · ..-. .. -. .- -. -.-. . .- .-. - .. -.-. .-.. . ... --..-- -- .- -.- . ... - --- --- .-.. ... --..-- .- -. -.. .- .--. .. ... - --- .... . .-.. .--. -... ..- ... .. -. . ... ... . ... .- -. -.. .--. . --- .--. .-.. . --. .-. --- .-- .-.-.-
Чудово, ми отримали повідомлення в азбуці Морзе. Що далі?
Перед тим, як переходити до розшифрування, давайте поміркуємо, як реалізувати декодування.
…
Першим кроком має бути обернення словника `CHARS_TO_MORSE_CODE_MAPPING`. Створення оберненого словника вручну є нераціональним і потребує оновлення при кожній зміні оригінального словника. Тому, напишемо код, який переверне словник:
def reverse_mapping(mapping): reversed = {} for key, value in mapping.items(): reversed[value] = key return reversed
Цей код змінює місцями ключі та значення у заданому словнику. В результаті ми отримаємо словник, де ключі будуть значеннями з попереднього словника, а значення – ключами.
Тепер у нас є все необхідне, щоб декодувати азбуку Морзе у звичайний англійський текст. Перейдемо безпосередньо до розшифрування.
Перетворення з азбуки Морзе на англійську мову
Процес декодування є зворотнім до процесу кодування. Розглянемо алгоритм декодування азбуки Морзе:
- Перетворіть словник `CHARS_TO_MORSE_CODE_MAPPING` за допомогою раніше написаної утилітарної функції.
- Проходимо по символах азбуки Морзе і відстежуємо поточний символ.
- Якщо зустрічається пробіл, це означає, що ми зібрали повний код азбуки Морзе для декодування.
- Якщо поточний код порожній і ми бачимо два пробіли поспіль, додаємо роздільник слів, тобто один пробіл, у звичайному англійському тексті.
- Якщо попередня умова хибна, отримуємо декодований символ зі словника та додаємо його до результату. Обнуляємо поточний символ азбуки Морзе.
- Якщо пробіл не зустрічається, додаємо поточний символ до коду Морзе.
- Якщо зустрічається пробіл, це означає, що ми зібрали повний код азбуки Морзе для декодування.
- Якщо залишився останній символ, декодуємо його і додаємо до результату.
- Повертаємо отриманий результат.
Перевіримо код для наведеного алгоритму:
def reverse_mapping(mapping): # код функції з попереднього фрагмента 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': '-----', '.': '.-.-.-', ',': '--..--', '?': '..--..', '\'': '· − − − − ·', '!': '− · − · − −', '/': '− · · − ·', '(': '− · − − ·', ')': '− · − − · −', '&': '· − · · ·', ':': '− − − · · ·', ';': '− · − · − ·', '=': '− · · · −', '+': '· − · − ·', '-': '− · · · · −', '_': '· · − − · −', '"': '· − · · − ·', '$': '· · · − · · −', '@': '· − − · − ·', } 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: # перевірка символу if morse_code[i] == ' ': # перевірка слова if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ': english_plain_text += ' ' i += 1 else: # додаємо декодований символ до результату english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[ current_char_morse_code] current_char_morse_code="" else: # додаємо символ азбуки Морзе до поточного символу current_char_morse_code += morse_code[i] i += 1 # додаємо останній символ до результату 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)
У коді вище використано азбуку Морзе, яку згенерувала функція кодування. Після запуску цього коду отримаємо наступний результат:
TECHUKRAINE.NET PRODUCES HIGH-QUALITY TECHNOLOGY & FINANCE ARTICLES, MAKES TOOLS, AND APIS TO HELP BUSINESSES AND PEOPLE GROW.
Примітка: вихідні дані представлені у верхньому регістрі, оскільки у словнику для відображення використовуються великі літери.
Завершальні думки
Як бачимо, функція декодування повертає текст у верхньому регістрі. Ви можете удосконалити програму, щоб вихідний текст зберігав регістр символів, відстежуючи малі та великі літери англійського алфавіту. Це не має прямого відношення до азбуки Морзе, оскільки великі та малі літери мають однаковий код. Спробуйте це в якості цікавої задачі.
На цьому наш посібник завершено. Використовуйте ці програми, якщо вам доведеться зіткнутися з кодом Морзе в майбутньому.
Успішного кодування! 👨💻
Також вам може бути цікаво, як згенерувати випадковий пароль за допомогою Python.