如何使用Python创建一个莫尔斯码翻译器

摩尔斯电码是一种使用划线空格来编码消息的方法。它被广泛用于秘密传递消息。

你可能在很多电影中的海军场景中看到过摩尔斯电码的使用来传递消息。我们在这里讨论的是相同的morse code,但唯一的区别是我们将编写一个Python程序来实现从英语到摩尔斯电码的翻译,反之亦然。

关于摩尔斯电码

摩尔斯电码对于每个英文字母、数字、标点符号和非拉丁字符都有不同的模式。一旦你知道了不同字符的摩尔斯电码模式,编码和解码就会变得容易。你可以参考摩尔斯电码的Wikipedia page获取更多详细信息和模式。

在本教程中,我们将学习如何将普通英语文本编码为摩尔斯电码,以及如何将摩尔斯电码解码为普通英语文本。在编码和解码时,我们将使用英文字母、数字和标点符号。如果你想添加更多类型的字符,一旦你掌握了编码和解码的基础,你可以很容易地做到。

需要记住的一点是,大写字母和小写字母具有相同的摩尔斯电码模式。这是因为摩尔斯电码主要用于不关心字母大小写的通信,就像日常对话一样。

让我们进入编码和解码的代码部分。

英语到摩尔斯电码

将普通英语文本转换为摩尔斯电码的算法非常简单。让我们来看看算法。

  1. 创建一个包含英文字母、数字和标点符号的摩尔斯电码模式映射的字典。
  2. 遍历文本,将每个字符的摩尔斯电码模式添加到结果中。
    • 摩尔斯电码在每个字符后面都包含一个空格,每个单词后面都包含两个空格
    • 因此,当我们在文本中遇到空格时,也就是单词的分隔符,我们需要在结果中添加两个空格。
  3. 最终得到的字符串将是我们所需要的摩尔斯电码。
  4. 最后,返回结果。

试着用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(
    'Geekflare 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

我们只是使用上面的代码反转了给定字典的键值对。结果字典将包含以值为新键的键以及以键为新值。

我们已经拥有将摩尔斯码解码为纯英文文本的所有组件。不再废话,让我们解码摩尔斯码。

摩尔斯码到英文

我们可以反转摩尔斯码编码的过程来获得解码算法。让我们来看看将摩尔斯码解码为纯英文文本的算法。

  1. 使用我们编写的实用函数反转CHARS_TO_MORSE_CODE_MAPPING字典。
  2. 遍历摩尔斯码并跟踪当前摩尔斯码字符。
    • 如果遇到空格,表示我们有一个完整的摩尔斯码字符需要解码。
      • 如果当前摩尔斯码字符为空且我们有两个连续的空格,则添加一个单个空格作为英文纯文本中的单词分隔符。
      • 如果上述条件为假,则从字典中获取解码后的字符并将其添加到结果中。重置当前摩尔斯码字符。
    • 如果我们没有遇到空格,则将其添加到当前摩尔斯字符。
  3. 如果存在最后一个字符,在使用字典解码后将其添加到结果中。
  4. 在最后返回结果。

让我们来检查上述算法的代码。

def reverse_mapping(mapping):
    # 添加来自上一个片段的函数代码...

CHARS_TO_MORSE_CODE_MAPPING = {} # 添加字典值 
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  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)

我给出了从编码函数生成的摩尔斯码。如果我们运行上述程序,将会得到以下输出。

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

注意:输出为英文大写字母,因为我们在字典中使用了大写字母进行映射。

最后的话

我们已经看到解码函数的输出为大写字母。您可以通过跟踪英文字母的大小写来将输出设置为与给定时间相同。这与摩尔斯码无关,因为大小写字母具有相同的模式。尝试一下,编码的过程更有趣。

这就是本教程的全部内容。下次遇到摩尔斯码时,请使用我们编写的程序。

Happy Coding 👨‍💻

您现在可以查看如何create a random password in Python

另外,检查这些English to Morse code translators

类似文章