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

Kal*_*vis 4 c# morse-code

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

-.-..--.....-...--..----.
Run Code Online (Sandbox Code Playgroud)

通常它看起来像那样,

- .-. .- -. ... .-.. .- - .. --- -.
t  r  a  n   s   l   a  t  i  o  n 
Run Code Online (Sandbox Code Playgroud)

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

Eni*_*ity 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" }, 
    { "--..", " " }, 
};
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"开头.人类如何在飞行中做到这一点真是惊人!