引用David Richerby的评论:
由于⋅表示E和-表示T,没有空格任何莫尔斯消息可以被解释为在一个字符串{ E,Ť}∗
此外,由于A,I,M和N由两个摩尔斯字符(分别为⋅-,⋅⋅,-,-⋅)的四个可能的组合表示,所以任何不带空格的消息也可以解释为字符串 。请注意,对于任何长度大于1的摩尔斯电文,这与David的解释是不同的。因此,唯一具有唯一解释的消息是长度为1的消息(如果算作一条消息,我想为0),即⋅表示E,而-表示T。{ A ,我,M,N}∗{ E,Ť} ?
这是一些JavaScript,可以告诉您对.
and 字符串的所有可能解释-
。长度最大为22的字符串在不到一秒钟的时间内就会运行,但是任何超出此长度的字符串都会变得非常慢-例如,我不会尝试使用它来解码HELLO WORLD。您可以在浏览器中弹出一个JavaScript控制台,将其粘贴,然后调用,例如decode('......-...-..---')
。(在此示例中,条目#2446是预期的字符串“ HELLO”。)
var decode = function(code) {
var cache = {
'0': ['']
};
for(var start = 0;start < code.length;start++) {
for(var len = 1;len < 6;len++) {
if(start + len > code.length) continue;
if(!cache[start + len]) cache[start + len] = [];
var curCode = code.slice(start, start + len);
if(dict[curCode]) {
for(var i_start = 0;i_start < cache[start].length;i_start++) {
cache[start + len].push(cache[start][i_start] + dict[curCode]);
}
}
}
}
return cache[code.length];
};
var 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',
'.----': '1',
'..---': '2',
'...--': '3',
'....-': '4',
'.....': '5',
'-....': '6',
'--...': '7',
'---..': '8',
'----.': '9',
'-----': '0'
};
将其仅修剪为实际单词字符串的代码要长一些,因此我将其放在此处。它在node.js下运行,并期待在的文件/usr/share/dict/words-2500
。我正在使用的字典可以在这里找到。它不是幼稚的-它会修剪,因此在较大的输入上运行速度要快得多。
该词典由我在互联网上某个地方找到的前2500个单词列表组成,减去了一些我认为不是单词的1、2和3个字母的组合。该算法对有太多短单词可供选择非常敏感,并且如果您允许将每个字母都作为一个单词(如果我看着您/usr/share/dict/words
),则会大大降低速度。
该算法以单词数量为基础进行排序,因此“有趣的”单词将有望排在最前面。此方法适用于HELLO WORLD
,运行时间不到一秒,可将期望的词组作为第一匹配返回。从中我还了解到DATA SCIENTIST
(我尝试过的唯一其他短语)莫尔斯电码与相同NEW REAL INDIA
。
编辑:我搜索了一些有趣的几分钟。单词SPACES
和SWITCH
是词形图。到目前为止,它们是我发现的最长的单字对。