Декодировать Морзе без пробелов в текст

Есть ли возможность декодировать азбуку Морзе в текст, если код имеет следующий формат (без пробелов):

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

Обычно это выглядит так,

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

но возможно ли получить тот же текст из азбуки Морзе без пробелов?


person Kalvis    schedule 15.03.2014    source источник
comment
Проблема здесь в том, что буквы азбуки Морзе не имеют статического количества точек/тире, равного одной букве. Если бы это было так, то это было бы просто, иначе вы столкнетесь с невыполнимой задачей, если не расшифруете каждую возможность и не проверите какой-то алгоритм, чтобы убедиться, что он действителен на английском языке (или известная фраза)   -  person JNYRanger    schedule 15.03.2014
comment
Это именно то, что я думаю, но я дал такое упражнение и просто подумал, что упускаю что-то очевидное.   -  person Kalvis    schedule 15.03.2014


Ответы (4)


Это возможно сделать, но это становится проблематичным, поскольку в конечном итоге вы генерируете большое количество возможных вариантов.

Сначала начните с отображения Морзе:

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

Он включает «транс», так что, похоже, он работает.

Выполнение полной строки дает 5 914 901 возможных вариантов с "переводом" в качестве одной из возможностей.

Между прочим, было 4519 возможных строк, которые просто начинались с «транс». Удивительно, как люди смогли сделать это на лету!

person Enigmativity    schedule 15.03.2014
comment
Людям не нужно выяснять, какой перевод использовать. В настоящей азбуке Морзе между буквами есть пробелы. Я почти уверен, что оператор азбуки Морзе, получив этот набор точек и тире без каких-либо перерывов между ними, не понял бы, что было отправлено. - person juharr; 09.12.2019

То, что вы предлагаете, на самом деле невозможно.

Вы не сможете сказать, где заканчивается одна буква и начинается следующая. Как вы сможете отличить буквы? Будет ли первая буква -, -. или -.-?

person Blue Ice    schedule 15.03.2014
comment
--.. это Z :) ..-- может быть EETT, EW, IM или UT - person n8wrl; 15.03.2014
comment
Да, я знаю.. есть главная проблема. Думал, что у вас, ребята, может быть проблема с этой проблемой. - person Kalvis; 15.03.2014

Я не сомневаюсь, что при наличии достаточно продвинутого алгоритма и достаточного контекста вокруг каждой буквы можно получить высокий уровень точности. Однако проблема приближается к сложности уровня AGI, требуемая большей точности, потому что это один из навыков (быстрое сопоставление с образцом в языке), в котором люди особенно хороши, а машины далеко не так хороши (пока). Причина этого в том, что более широкий контекст, который делает возможным сопоставление с образцом для людей, включает не только возможные слова, но и семантику и общий смысл истории, а также сопоставление это с моделью мира, которая имеет смысл. . Это то, что чрезвычайно сложно запрограммировать на компьютере. Также человеческий мозг массивно параллелен.

Кроме того, довольно просто доказать, что общее совершенное решение невозможно (идеально точный перевод для каждой возможной входной строки). Например, рассмотрим просто короткую строку ".--", которая может означать "at" или "em", оба допустимых английских слова.

person Brad Thomas    schedule 15.03.2014

Вы должны знать, где символы начинаются и заканчиваются. Возьмем, например:

 ...---...

Если вы разделите его в одну сторону, вы получите:

... --- ... = SOS

Однако, если вы разделите его по-другому, вы можете получить:

. .. - -- . .. = EITMEI

Итак, возможно ли это? Технически да, это возможно. Однако у вас будет огромное количество возможных решений, на выявление и перевод которых уйдет много времени. Имея базу данных часто встречающихся слов, вы могли бы сделать это немного умнее, но это все равно было бы максимальным усилием.

person Philippe Signoret    schedule 15.03.2014