Документация Engee
Notebook

Перевод текста в азбуку Морзе

Азбука Морзе, также известная как код Морзе, — это система передачи текстовой информации. Она основана на использовании двух сигналов различной продолжительности — точки (короткий сигнал) и тире (длинный сигнал). Эта система была разработана американским изобретателем Сэмюэлем Морзе в первой половине XIX века и стала одним из первых методов телеграфной связи.

Каждая буква алфавита, цифра и некоторые знаки препинания представлены уникальной комбинацией точек и тире, например, буква A передается как точка-тире (.–), а буква B — тире-точка-точка-точка (-...). Между двумя последовательными точками или тире внутри одного знака делается короткая пауза, между разными знаками (буквами или цифрами) — пауза чуть длиннее. В свою очередь, пауза между словами еще больше.

Азбука Морзе широко использовалась в телеграфии для передачи сообщений на большие расстояния. Также она нашла применение в радиосвязи, особенно в морской и авиационной отраслях.

В наши дни азбуку Морзе продолжают изучать и применять энтузиасты радио и любители ретро-технологий, так как передача сигнала может осуществляться с помощью простых устройств, таких, как телеграфный ключ, и даже при плохих условиях связи сигналы могут быть распознаны благодаря их простоте.

Теперь, опираясь на описанные выше теоретические основы этой системы, зададим словарь для латинских букв и арабских цифр.

In [ ]:
# Словарь для преобразования символов в азбуку Морзе
morse_code = Dict(
    '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' => "--..",
    '0' => "-----",
    '1' => ".----",
    '2' => "..---",
    '3' => "...--",
    '4' => "....-",
    '5' => ".....",
    '6' => "-....",
    '7' => "--...",
    '8' => "---..",
    '9' => "----.",
    ' ' => "/" # Пробел между словами обозначается слешем
)
Out[0]:
Dict{Char, String} with 37 entries:
  '1' => ".----"
  'E' => "."
  'Z' => "--.."
  '6' => "-...."
  'X' => "-..-"
  '7' => "--..."
  'B' => "-..."
  'C' => "-.-."
  '5' => "....."
  'D' => "-.."
  'A' => ".-"
  '4' => "....-"
  'R' => ".-."
  'G' => "--."
  '8' => "---.."
  'F' => "..-."
  'N' => "-."
  'M' => "--"
  'K' => "-.-"
  'J' => ".---"
  'O' => "---"
  'I' => ".."
  'P' => ".--."
  'H' => "...."
  'Q' => "--.-"
  ⋮   => ⋮

Определим функцию перевода строки в формате кода Морзе. Данная функция выполняет поиск значения в словаре. Если значение не найдено, то она оставляет его без изменений.

In [ ]:
function text_to_morse(text::String)
    morse_message = String[]  
    for char in uppercase(text)
        if haskey(morse_code, char)
            push!(morse_message, string(morse_code[char]))  # Присваиваем значение из словаря
        else
            push!(morse_message, string(char))  # Оставляем исходный символ
        end
    end
    return join(morse_message, " ")  # Объединяем элементы вектора через пробел
end
Out[0]:
text_to_morse (generic function with 1 method)
In [ ]:
# Пример использования функции
input_text = "ENGEE!"
output_morse = text_to_morse(input_text)
println(output_morse)
. -. --. . . !

Вывод

Результаты демонстрации подтверждают, что данная функция работает корректно. В связи с тем, что для восклицательного знака не задано значение в словаре, на выходе мы получаем этот знак.