这是可以做到的,但是当您最终生成大量可能的选项时,它会变得有问题。
首先从莫尔斯映射开始:
private Dictionary<string, string> map = new Dictionary<string, string>()
{
{ ".-", "a" },
{ "-...", "b" },
{ "-.-.", "c" },
{ "-..", "d" },
{ ".", "e" },
{ "..-.", "f" },
{ "--.", "g" },
{ "....", "h" },
{ "..", "i" },
{ ".---", "j" },
{ "-.-", "k" },
{ ".-..", "l" },
{ "--", "m" },
{ "-.", "n" },
{ "---", "o" },
{ ".--.", "p" },
{ "--.-", "q" },
{ ".-.", "r" },
{ "...", "s" },
{ "-", "t" },
{ "..-", "u" },
{ "...-", "v" },
{ ".--", "x" },
{ "-..-", "y" },
{ "-.--", "z" },
{ "--..", " " },
};
那么这个函数可以产生可能的解码:
public IEnumerable<string> DecodeMorse(string morse)
{
var letters =
map
.Where(kvp => morse.StartsWith(kvp.Key))
.Select(kvp => new
{
letter = kvp.Value,
remainder = morse.Substring(kvp.Key.Length)
})
.ToArray();
if (letters.Any())
{
var query =
from l in letters
from x in DecodeMorse(l.remainder)
select l.letter + x;
return query.ToArray();
}
else
{
return new [] { "" };
}
}
现在,给定一个较短版本的输入莫尔斯语,“-.-..--....”,我得到了 741 个可能的字符串。这是精简版:
cabe
cadee
cadi
…
tranie
trans
trateeee
…
trxii
trxse
它包含“trans”,所以它似乎在工作。
在完整字符串上运行会产生 5,914,901 个可能,其中“翻译”是其中一种可能性。
顺便说一句,有 4,519 个可能的字符串只是以“trans”开头。人类如何能够在飞行中做到这一点真是太神奇了!