解码莫尔斯没有白色空格到文本

时间:2014-03-15 00:50:52

标签: c# morse-code

如果代码采用以下格式(没有任何空格),是否有可能将莫尔斯代码解码为文本:

-.-..--.....-...--..----.

通常它看起来像那样,

- .-. .- -. ... .-.. .- - .. --- -.
t  r  a  n   s   l   a  t  i  o  n 

但是有可能从没有空格的摩尔斯电码获得相同的文字吗?

4 个答案:

答案 0 :(得分:5)

这是可以做到的,但是当你最终生成大量可能的选项时会出现问题。

首先从莫尔斯映射开始:

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 [] { "" };
    }
}

现在,考虑到输入莫尔斯的更短版本,&#34; -.- .. - ....&#34;,我得到了741个可能的字符串。这是减少的版本:

cabe
cadee
cadi
…
tranie
trans
trateeee
…
trxii
trxse

它包括&#34; trans&#34;所以它似乎正在发挥作用。

在完整的字符串上运行可以生成5,914,901个&#34;翻译&#34;作为其中一种可能性。

顺便提一下,有4,519个可能的字符串只是以&#34; trans&#34;开头。人类如何在飞行中做到这一点真是惊人!

答案 1 :(得分:3)

你提出的建议并非如此。

你无法分辨一个字母的结尾和下一个字母的开头。你怎么能分辨出字母之间的区别?第一个字母是--.还是-.-

答案 2 :(得分:2)

毫无疑问,考虑到一个足够先进的算法,并且每个字母周围有足够的上下文,可以获得高水平的准确性。然而,问题接近AGI级难度,你需要更高的准确性,因为这是人类特别擅长的技能之一(语言中的快速模式匹配),并且机器在(还)方面远没有那么好。其原因在于,使人类可以进行模式匹配的更广泛的背景不仅包括可能的单词,还包括语义和故事的整体意义,并将 映射到有意义的世界模型。这对计算机编程非常困难。人脑也是大规模平行的。

此外,证明一般的完美解决方案是不可能的(每个可能的输入字符串的完美准确的翻译)是相当微不足道的。例如,只考虑短字符串“.--”,这可能意味着“at”或“em”,都是有效的英语单词。

答案 3 :(得分:0)

你需要知道角色的起点和终点。举个例子:

 ...---...

如果你将它分开,你会得到:

... --- ... = SOS

但是,如果你对它进行不同的划分,你可能会得到:

. .. - -- . .. = EITMEI

那么,有可能吗?从技术上讲,是的,它是可能的。但是,您将拥有大量可能需要很长时间才能识别和翻译的解决方案。使用常见单词的数据库,您可能会使这更聪明,但它仍然是最好的努力。