【问题标题】:Decode Morse without white spaces to text将没有空格的摩尔斯解码为文本
【发布时间】:2014-04-20 12:32:16
【问题描述】:

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

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

通常是这样的,

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

但是是否有可能从摩尔斯电码中获取相同的文本而没有空格?

【问题讨论】:

  • 这里的问题是摩尔斯电码字母没有等于单个字母的静态点/破折号。如果是这种情况,那么这将很简单,否则你将面临一个不可能的挑战,除非你解码所有可能性并进行某种算法检查以查看它是否是有效的英语(或已知短语)
  • 这正是我的想法,但我进行了那种练习,只是觉得我错过了一些明显的东西。

标签: c# morse-code


【解决方案1】:

这是可以做到的,但是当您最终生成大量可能的选项时,它会变得有问题。

首先从莫尔斯映射开始:

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”开头。人类如何能够在飞行中做到这一点真是太神奇了!

【讨论】:

  • 人类不必弄清楚要使用哪种翻译。在真正的摩尔斯电码中,字母之间有空格。我很确定,给定这组点和破折号的摩尔斯电码操作员,中间没有任何中断,不会知道发送的是什么。
【解决方案2】:

你的提议是不可能的。

您将无法分辨一个字母的结尾和下一个字母的开头。你将如何分辨字母之间的区别?第一个字母是--. 还是-.-

【讨论】:

  • --.. 是 Z :) ..-- 可以是 EETT、EW、IM 或 UT
  • 是的,我知道..这是主要问题。认为你们可能对这个问题有一些问题。
【解决方案3】:

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

此外,证明一般完美解决方案是不可能的(对每个可能的输入字符串进行完美准确的翻译)是相当简单的。例如,简单考虑短字符串“.--”,它可能表示“at”或“em”,这两个都是有效的英文单词。

【讨论】:

    【解决方案4】:

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

     ...---...
    

    如果你把它分成一种方式,你会得到:

    ... --- ... = SOS
    

    但是,如果你以不同的方式划分它,你可能会得到:

    . .. - -- . .. = EITMEI
    

    那么,有可能吗?从技术上讲,是的,这是可能的。但是,您将有大量可能的解决方案,需要很长时间才能识别和翻译。使用常用词的数据库,您也许可以让它变得更聪明一些,但它仍然是尽力而为。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 2013-01-09
      • 2020-02-11
      • 1970-01-01
      • 2020-05-25
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多