コメントからDavid Richerbyを引用:
⋅はEを表し、−はTを表すため、スペースのないモールス信号は{ E 、T } ∗の文字列として解釈できます。{ E、T}∗
さらに、A、I、M、およびNは2つのモールス文字(それぞれfour-、combinations、-、-⋅)の4つの可能な組み合わせで表されるため、スペースのないメッセージも文字列として解釈できます。 。長さが1を超えるモールス信号の場合、これはDavidの解釈とは異なることに注意してください。したがって、一意の解釈を持つ唯一のメッセージは、長さ1(およびメッセージとしてカウントする場合は0)のメッセージ、つまりEを表す⋅、およびTを表す-のみです。{ A 、I、M、N}∗{ E、T} ?
ここではいくつかのJavaScriptは、あなたの文字列のすべての可能な解釈教えてくれることだ.
とします-
。長さ22までの文字列は1秒未満で実行されますが、それよりも長い文字列はかなり遅くなり始めます。たとえば、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
、1秒未満で実行され、予想されるフレーズを最初のヒットとして返します。このことから、私はDATA SCIENTIST
(私が試した唯一のフレーズ)モールス符号がと同じであることも学びましたNEW REAL INDIA
。
編集:数分間、もっと面白いものを検索しました。言葉SPACES
とSWITCH
は、モルサグラムです。これまでのところ、それらは私が見つけた最長の単一単語のペアです。