当前位置: 首页 > 工具软件 > Morse.js > 使用案例 >

HOME: Morse Decoder —— 摩斯密码、正则表达式

上官自明
2023-12-01

CheckIO是一个通过闯关游戏学习编程的网站(Python和JavaScript)。通过解题开发新“岛屿”,同时,通过做任务获得Quest Points解锁会员题目。
文章内容:题目、我自己的思路和代码以及优秀代码,如果想看大神解题可以直接跳到“优秀代码”部分。
本题链接:https://py.checkio.org/en/mission/morse-decoder/

题目

这一任务是使用摩斯电码解密机密消息。

每条机密消息都由单词组成,单词之间有3个空格,每个单词的每个字母之间有1个空格。

如果解密后的文本以字母开头,该字母需要转为大写字母。

输入: 机密消息.

输出: 解密文本.

举个栗子:

morse_decoder("... --- -- .   - . -..- -") == "Some text"
morse_decoder("..--- ----- .---- ---..") == "2018"
morse_decoder(".. -   .-- .- ...   .-   --. --- --- -..   -.. .- -.--") == "It was a good day"

用处: For cryptography and spy work.(用于加密和间谍工作 )

假设:

  • 0 < 消息长度 < 100
  • 消息中仅包含数字和字母。

题目框架

MORSE = {'.-':    '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'
        }

def morse_decoder(code):
    # Your code here!
    return ''

if __name__ == '__main__':
    print("Example:")
    print(morse_decoder('... --- ...'))

    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert morse_decoder("... --- -- .   - . -..- -") == "Some text"
    assert morse_decoder("..--- ----- .---- ---..") == "2018"
    assert morse_decoder(".. -   .-- .- ...   .-   --. --- --- -..   -.. .- -.--") == "It was a good day"
    print("Coding complete? Click 'Check' to earn cool rewards!")

难度: Elementary+

思路及代码

思路

  1. code 分割为每个摩斯电码,形成列表;
  2. 定义 result 字符串用于存放破解出的字母或密码;
  3. 利用 MORESE 字典,将列表中的每个元素转换为字母或数字,同时添加到 result 字符串里;
  4. result 字符串里的首字母大写。

代码

def morse_decoder(code):
    code = code.replace('   ', '  ').split(' ')
    result = ''
    for i in code:
        if i:
            result += MORSE[i]
        else:
            result += ' '
    result = result.capitalize()
    return result

优秀代码

No.1

import re
def morse_decoder(code):
    return re.sub(' ?(\S+) ?', lambda m: MIORSE[m.group(1)], code).capitalize()

将一个前和后 有或没有空格的任意长度字符串替换为 MORESE 字典里对应的值。

No.2

def morse_decoder(c):
    return "".join(MORSE[i] for i in re.findall("([.-]+| {3})", c)).capitalize()
 类似资料: