如果代码采用以下格式(没有任何空格),是否有可能将莫尔斯电码解码为文本:
-.-..--.....-...--..----.
通常看起来是这样的,
- .-. .- -. ... .-.. .- - .. --- -.
t r a n s l a t i o n
但是是否有可能从没有空格的摩尔斯电码中获得相同的文本?
如果代码采用以下格式(没有任何空格),是否有可能将莫尔斯电码解码为文本:
-.-..--.....-...--..----.
通常看起来是这样的,
- .-. .- -. ... .-.. .- - .. --- -.
t r a n s l a t i o n
但是是否有可能从没有空格的摩尔斯电码中获得相同的文本?
这是可能的,但是当您最终生成大量可能的选项时,它会变得有问题。
首先从莫尔斯映射开始:
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”开头。人类如何能在飞行中做到这一点真是太神奇了!
您提出的建议是不可能的。
您将无法分辨一个字母的结尾和下一个字母的开头。你将如何分辨字母之间的区别?第一个字母是-
, -.
, 还是-.-
?
毫无疑问,只要有足够先进的算法,以及每个字母周围的足够上下文,就有可能获得高水平的准确性。然而,问题越接近 AGI 级别的难度,您需要的精度越高,因为这是人类特别擅长的技能之一(语言中的快速模式匹配),而机器(目前)还远不及擅长。原因在于,使人类模式匹配成为可能的更广泛的上下文不仅包括可能的单词,还包括语义和故事的整体含义,并将其映射到有意义的世界模型。这是对计算机进行编程非常困难的事情。人脑也是大规模并行的。
此外,证明一般完美解决方案是不可能的(对每个可能的输入字符串进行完美准确的翻译)是相当简单的。例如,简单地考虑短字符串“.--”,它可能表示“at”或“em”,这两个都是有效的英语单词。
您需要知道角色的开始和结束位置。举个例子:
...---...
如果你以一种方式划分它,你会得到:
... --- ... = SOS
但是,如果你以不同的方式划分它,你可能会得到:
. .. - -- . .. = EITMEI
那么,有可能吗?从技术上讲,是的,这是可能的。但是,您将有大量可能的解决方案,需要很长时间才能识别和翻译。使用常用词的数据库,您也许可以使它更聪明一点,但这仍然是尽力而为。