解码莫尔斯没有空白的文本

本文关键字:空白 文本 解码 | 更新日期: 2023-09-27 17:50:32

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

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

通常是这样的

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

,但它是可能的,从莫尔斯电码没有空格得到相同的文本?

解码莫尔斯没有空白的文本

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

首先从Morse映射开始:

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种可能,其中"translation"是一种可能。

顺便说一下,有4,519个可能的字符串以"trans"开头。人类能在飞行中做到这一点真是太神奇了!

你的建议是不可能的。

你将无法分辨一个字母的结尾和下一个字母的开始。你怎样才能分辨字母之间的区别呢?第一个字母是--.还是-.- ?

毫无疑问,在我看来,只要有足够先进的算法,以及每个字母的足够上下文,就有可能获得高水平的准确性。然而,问题接近agi级别的难度,您需要更高的准确性,因为这是人类特别擅长的技能之一(语言中的快速模式匹配),而机器(目前)还远没有这么擅长。这样做的原因是,使人类模式匹配成为可能的更广泛的上下文不仅包括可能的单词,还包括语义和故事的总体含义,以及将映射到有意义的世界模型。这是用计算机编程来完成的极其困难的事情。而且人类的大脑是高度并行的。

同样,证明一般完美解决方案是不可能的(对每个可能的输入字符串进行完美准确的翻译)是相当简单的。例如,简单地考虑短字符串"。

您需要知道字符的开始和结束位置。例如:

 ...---...

如果你把它分开,你得到:

... --- ... = SOS

然而,如果你把它分开,你可能会得到:

. .. - -- . .. = EITMEI

那么,这可能吗?从技术上讲,是的,这是可能的。然而,您将有大量可能的解决方案,需要花费很长时间来识别和翻译。如果有一个常用词的数据库,您可能可以使它更聪明一些,但它仍然是最好的选择。