如果代码采用以下格式(没有任何空格),是否有可能将莫尔斯代码解码为文本:
-.-..--.....-...--..----.
Run Code Online (Sandbox Code Playgroud)
通常它看起来像那样,
- .-. .- -. ... .-.. .- - .. --- -.
t r a n s l a t i o n
Run Code Online (Sandbox Code Playgroud)
但是有可能从没有空格的摩尔斯电码获得相同的文本吗?
这是可能的,但是当您最终生成大量可能的选项时,它会成为问题.
首先从莫尔斯映射开始:
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" },
{ "--..", " " },
};
Run Code Online (Sandbox Code Playgroud)
然后这个函数可以产生可能的解码:
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 [] { "" };
}
}
Run Code Online (Sandbox Code Playgroud)
现在,考虑到输入莫尔斯的更短版本"-.- .. - ....",我得到了741个可能的字符串.这是减少版本:
cabe
cadee
cadi
…
tranie
trans
trateeee
…
trxii
trxse
Run Code Online (Sandbox Code Playgroud)
它包括"trans",因此它似乎正在起作用.
在完整的字符串上运行产生5,914,901可能,其中"翻译"是其中一种可能性.
顺便提一下,有4,519个可能的字符串只是以"trans"开头.人类如何在飞行中做到这一点真是惊人!
| 归档时间: |
|
| 查看次数: |
3046 次 |
| 最近记录: |