首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以更仿生的方式解码morse码

如何以更仿生的方式解码morse码
EN

Stack Overflow用户
提问于 2022-02-13 10:53:20
回答 1查看 1.2K关注 0票数 2

我在python中做了一个morse_code解码器,作为一个赋值,如下所示。它处理morse_code中可用的所有字符。虽然我的方法奏效了,但它似乎是一种非常业余的在python中做事的方法。发送莫尔斯码的格式:

  1. 字符是通过将它们替换为'.‘的组合来编码的。‘-’
  2. 字符用“

”分隔

在下面的代码中,我创建了一个空列表,其中包含一个列表,其中每个项代表一个morse代码字符,然后替换为实际字符。最后,将列表中的列表连接起来,并将结果列表连接起来,以便将其作为字符串值返回。我使用列表的原因是字符串在python中是不可变的。我无法创建空字符串,进入for循环,并将其追加到字符串中。我也不能在for循环中创建一个新的字符串,因为变量在离开for循环作用域时会丢失。

我已经尝试过先用替换方法来完成它,但是我遇到了麻烦,因为替换没有解码morse代码所需的灵活性。

代码语言:javascript
复制
decode_morse(morse_code):
    morse_code_q = " "+morse_code+" "
    morse_code_r = morse_code_q.replace(" .- ", ' A ').replace(" -... ", ' B ').replace(' -.-. ', ' C ').replace(' -.. ', 'D ').replace(' . ', ' E ').replace(' ..-. ', ' F ').replace(' --. ', ' G ').replace(' .... ', ' H ').replace(' .. ', ' I ').replace(' .--- ', ' J ').replace(' .-. ', ' K ').replace(' .-.. ', ' L ').replace(' -- ', ' M ').replace(' -. ', ' N ').replace(' --- ', ' O ').replace(' .--. ', ' P ').replace(' --.- ', ' Q ').replace(' .-. ', ' R ').replace(' ... ', ' S ').replace(' - ', ' T ').replace(' ..- ', ' U ').replace(' ...- ', ' V ').replace(' .--', ' W ').replace(' -..- ', ' X ').replace(' -.-- ', ' Y ').replace(' --.. ', ' Z ').replace(' ----- ', '0').replace(' .---- ', '1').replace(' ..--- ', '2').replace(' ...-- ', '3').replace(' ....- ', '4').replace(' ..... ', '5').replace(' -.... ', '6').replace(' --... ', '7').replace(' ---.. ', '8').replace(' ----. ', '9').replace(' .-.-.- ', '.').replace(' --..-- ', ',').replace(' ..--.. ', '?')
    return morse_code_r.strip()
print(decode_morse('.... . -.--   .--- ..- -.. .'))

它返回HEY,而不是HEY。忽略这些空间不会有多大好处。替换字符后,下一个替换函数将找不到字符,因为它需要空格来确定字符的开始和结束(否则.因为他会下决心的,因为。= E)

所以,这是我非常丑陋但工作的方法:

代码语言:javascript
复制
def decode_morse(morse_code):
  result=[]
  words = morse_code.split("   ")
  for j in range(0,len(words)):
    reverser = words[j].split(" ")
    for i in range(0,len(reverser)):
      if reverser[i]==".-":
          reverser[i]='A'
      elif reverser[i]=="-...":
        reverser[i]='B'
      elif reverser[i]=="-.-.":
        reverser[i]='C'
      elif reverser[i]=="-..":
        reverser[i]='D'
      elif reverser[i]==".":
        reverser[i]='E'
      elif reverser[i]=="..-.":
        reverser[i]='F'
      elif reverser[i]=="--.":
        reverser[i]='G'
      elif reverser[i]=="....":
        reverser[i]='H'
      elif reverser[i]=="..":
        reverser[i]='I'
      elif reverser[i]==".---":
        reverser[i]='J'
      elif reverser[i]==".-.":
        reverser[i]='K'
      elif reverser[i]==".-..":
        reverser[i]='L'
      elif reverser[i]=="--":
        reverser[i]='M'
      elif reverser[i]=="-.":
        reverser[i]='N'
      elif reverser[i]=="---":
        reverser[i]='O'
      elif reverser[i]==".--.":
        reverser[i]='P'
      elif reverser[i]=="--.-":
        reverser[i]='Q'
      elif reverser[i]==".-.":
        reverser[i]='R'
      elif reverser[i]=="...":
        reverser[i]='S'
      elif reverser[i]=="-":
        reverser[i]='T'
      elif reverser[i]=="..-":
        reverser[i]='U'
      elif reverser[i]=="...-":
        reverser[i]='V'
      elif reverser[i]==".--":
        reverser[i]='W'
      elif reverser[i]=="-..-":
        reverser[i]='X'
      elif reverser[i]=="-.--":
        reverser[i]='Y'
      elif reverser[i]=="--..":
        reverser[i]='Z'
      elif reverser[i]=="-----":
        reverser[i]='0'
      elif reverser[i]==".----":
        reverser[i]='1'
      elif reverser[i]=="..---":
        reverser[i]='2'
      elif reverser[i]=="...--":
        reverser[i]='3'
      elif reverser[i]=="....-":
        reverser[i]='4'
      elif reverser[i]==".....":
        reverser[i]='5'
      elif reverser[i]=="-....":
        reverser[i]='6'
      elif reverser[i]=="--...":
        reverser[i]='7'
      elif reverser[i]=="---..":
        reverser[i]='8'
      elif reverser[i]=="----.":
        reverser[i]='9'
      elif reverser[i]==".-.-.-":
        reverser[i]='.'
      elif reverser[i]=="--..--":
        reverser[i]=','
      elif reverser[i]=="..--..":
        reverser[i]='?'
    result.append(reverser)
    final =[]
    for h in range(0,len(result)):
      final.append("".join(result[h])+" ")
  return "".join(final)

print(decode_morse('.... . -.--   .--- ..- -.. .'))  #returns HEY JUDE

有人想要解决这个问题吗?对于本练习,我们不允许使用regexp库。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-13 11:02:29

只要有可能,始终将代码转换为数据。

代码语言:javascript
复制
# Full table at bottom of answer.
encode_table = {
    "A": ".-",
    "B": "-...",
    "C": "-.-.",
    ...
    " ": "SPACE",  # Special "sentinel" value to simplify decoder.
}

# Reverse of encode_table.
decode_table = {v: k for k, v in encode_table.items()}

现在,简单地:

代码语言:javascript
复制
def encode(s):
    enc = " ".join(encode_table[x] for x in s)
    return enc.replace(" SPACE ", "   ")

def decode(encoded):
    symbols = encoded.replace("   ", " SPACE ").split(" ")
    return "".join(decode_table[x] for x in symbols)

测试:

代码语言:javascript
复制
>>> encode("HEY JUDE")
'.... . -.--   .--- ..- -.. .'

>>> decode(".... . -.--   .--- ..- -.. .")
'HEY JUDE'

全表:

代码语言:javascript
复制
encode_table = {
    "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": "----.",
    ".": ".-.-.-",
    ",": "--..--",
    "?": "..--..",
    " ": "SPACE",
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71099952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档