打印出模糊莫尔斯代码的所有可能性

时间:2016-08-29 09:50:01

标签: python morse-code

我已经被赋予了学校问题的责任,这让我感到难过。我要做的是阅读一个含糊不清的莫尔斯代码字符串(即没有任何空格来说明什么是字母和什么不是)并打印出莫尔斯电码的所有可能的有效英语翻译可能。我已经看到一种算法可以在互联网上的某个地方解决这个问题但不知道如何将它转换为Python 3并且在我的生活中无法找到它。

一些有用的东西:

  • 我有一个程序认为有效的单词列表:Download

  • 该程序不需要输出格式正确的句子,只需要在words.txt中形成有效单词的句子。

  • 定义句子是否有效的一些额外的事情是句子不能有两个相同的词;所有单词必须是唯一的,并且句子中不能有多个单字母单词和一个双字母单词。
  • 我的代码目前尚未完整,但会将所有字词排序到相应的摩尔斯电码定义中:

    # Define the mapping from letter to Morse code.
    CODES = {
        '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': '--..',
    }
    words={}
    
    f=open('words.txt').read()
    a=f
    for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
      a=a.replace(i,CODES[i])
    f=f.split('\n')
    a=a.split('\n')
    for i in f:
          words[i]=a[f.index(i)]
        q=input('Morse: ')
    

这是如何工作的示例测试用例是:

Morse: .--....-....-.-..-----.
A BED IN DOG
A DID IN DOG
A BLUE DOG
A TEST IF DOG
WEST I IN DOG
WEST EVEN A ON
WEST IF DOG

1 个答案:

答案 0 :(得分:1)

要完成该程序,您需要使用递归算法,因为有很多可能的单词组合。

我更改了您的变量名称,以便他们很容易理解他们持有的数据。

decode函数用作递归算法。第一行检查莫尔斯是否为空,因此不需要运行该函数,因为它是一个结束点,它打印该分支的输出。

该函数的其余部分将检查是否可以从第一个i字母中生成一个单词。 i1开始,因为这是最短的字母,最大长度是文件中的最大莫尔斯长度。 while循环还通过检查i是否不大于莫尔斯的长度来检查是否发生了越界错误。

代码无法更改函数的参数,因为可以在导致冲突的相同函数中找到其他单词,因此为已更改的英语和莫尔斯创建了新变量。检查是否已重复并允许可能的单词长度。

from string import ascii_uppercase

#Defines the letter to Morse mapping
code = {
    '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': '--..'
}

#Opens the file and reads all words
file = open("words.txt","r")
words = file.read()
file.close()

morse = words

# Converts all words to morse
for letter in list(ascii_uppercase):
    morse = morse.replace(letter, code[letter])

# Creates list of the morse and english words from strings
morsewords = morse.split("\n")
engwords = words.split("\n")

# Finds the max length of morse words
maxlength = max([len(i)] for i in morsewords)[0]

# Creates a dictionary of {morse words : english words}
words = dict(zip(morsewords, engwords))

# MorseInput = input("Morse code :")
MorseInput = ".--....-....-.-..-----."

# This is the recursive function
def decode(morse, eng="", oneWord=False, twoWord=False):
    # Print the english when finished
    if morse == "":
        print(eng)
    else:
        i = 1
        # While loop allows to go through all possWord where condition met
        while len(morse) >= i and i <= maxlength:
            possWord = morse[:i]
            # Checks if the word is a real word
            if possWord in words.keys():
                # Real word therefore add to english and the morse
                newEng = eng + " " + words[possWord]
                newMorse = morse[i:]
                # Checks if that not more than one, One length word used
                if len(words[possWord]) == 1:
                    if not oneWord:
                        decode(newMorse, newEng, True, twoWord)
                # Checks if that not more than one, Two length word used
                elif len(words[possWord]) == 2:
                    if not twoWord:
                        decode(newMorse, newEng, oneWord, True)
                # Word is greater than two so doesn't matter
                else:
                    decode(newMorse, newEng, oneWord, twoWord)                    
            i += 1


decode(MorseInput)

我希望我的评论有道理。

我确信代码可以变得更好更短但我在一小时内完成了。

打印

A TEST IF DOG
A DID IN DOG
A BLUE DOG
WEST I IN DOG
WEST IF DOG
WEST EVEN A ON