Все ли строки азбуки Морзе однозначно расшифрованы? Без пробелов,
......-...-..---.-----.-..-..-..
может быть, Hello World
но, возможно, первая буква 5
- на самом деле это выглядит очень маловероятным, произвольная последовательность точек и тире должна иметь уникальный перевод.
Можно использовать неравенство Крафта, но это относится только к префиксным кодам .
Код Морзе с пробелами - это префиксный код, в котором сообщения всегда могут быть уникально декодированы. Как только мы удалим пробелы, это больше не так.
В случае, если я прав, и все сообщения азбуки Морзе не могут быть однозначно декодированы, есть ли способ перечислить все возможные сообщения? Вот некоторые связанные упражнения, которые я нашел на codegolf.SE
information-theory
coding-theory
Джон Мангуаль
источник
источник
Ответы:
Ниже приведены правдоподобные сообщения, но они имеют совершенно другое значение:
источник
I AM HIS DATE
«Итак, Амелия решила сбежать со старым Нунаном , хммм. Вероятно, нам следует оставить это при себе».Цитирую Дэвида Ричерби из комментариев:
Кроме того, поскольку A, I, M и N представлены четырьмя возможными комбинациями двух символов Морзе (⋅-, ⋅⋅, -, -⋅, соответственно), любое сообщение без пробелов также можно интерпретировать как строку в , Обратите внимание, что для любого сообщения Морзе длиной> 1 это отличается от интерпретации Дэвида. Таким образом, единственными сообщениями с уникальными интерпретациями являются сообщения длиной 1 (и, я полагаю, 0, если это считается сообщением), то есть ⋅, представляющий E, и -, представляющий T.{A,I,M,N}∗{E,T}?
Вот некоторый JavaScript, который расскажет вам все возможные интерпретации строки
.
и-
. Струны длиной до 22 запускаются менее чем за секунду, но все, что выше этого, начинает работать довольно медленно - я бы, например, не пытался декодировать HELLO WORLD с его помощью. Вы можете открыть консоль JavaScript в своем браузере, вставить ее, а затем вызвать, напримерdecode('......-...-..---')
,. (В этом примере запись # 2446 является предполагаемой строкой "HELLO".)Код для удаления только строк из реальных слов немного длиннее, поэтому я поместил его здесь . Он работает под node.js и ожидает файл в
/usr/share/dict/words-2500
. Словарь, который я использую, можно найти здесь . Это не наивно - оно сокращает, так как оно работает намного быстрее на больших входах.Словарь состоит из списка топ-2500 слов, который я где-то нашел в Интернете, за исключением некоторых 1-, 2- и 3-буквенных комбинаций, которые я считал не словами. Этот алгоритм чувствителен к наличию слишком большого количества коротких слов для выбора и резко замедляется, если вы разрешите, скажем, каждую отдельную букву как слово (я смотрю на вас
/usr/share/dict/words
).Алгоритм заканчивается сортировкой по количеству слов, поэтому «интересные», будем надеяться, будут наверху. Это прекрасно работает
HELLO WORLD
, работает меньше секунды и возвращает ожидаемую фразу как первый удар. Из этого я также узнал, чтоDATA SCIENTIST
(единственная другая фраза, которую я пробовал) азбукой Морзе так же, какNEW REAL INDIA
.Изменить: я искал более интересные в течение нескольких минут. Слова
SPACES
иSWITCH
морсаграммы. Пока что это самая длинная пара из одного слова, которую я нашел.источник
Достаточно заметить, что некоторые короткие комбинации букв дают неоднозначные расшифровки. Достаточно одной неоднозначной последовательности, но я вижу следующее:
и т.д. Как отмечает Дэвид Ричерби в комментариях, любая буква эквивалентна строке Es и Ts, что делает код Морзе неоднозначным как способ кодирования произвольных последовательностей букв; Приведенные выше комбинации показывают, что это верно даже для правдоподобных буквенных комбинаций на английском языке (например,
MEAT
~MITT
). Возможно, интересным упражнением в кодировании было бы найти все строки из пяти или менее букв, которые можно было бы принять за что-то другое, ограничиваясь буквенными комбинациями, которые на самом деле можно найти в английском тексте (используя одно или несколько слов), сгруппированными по классу эквивалентности.Используя ваш оригинальный пример, также случается, что
и хотя правая часть, возможно, нереалистична даже в виде частичного сообщения, это, безусловно, последовательность английских слов, которую можно найти менее чем за 15 минут без помощи компьютера. Это может быть принято как доказательство того, что многие фразы на английском языке могут быть неверно интерпретированы как другая (возможно, бессмысленная) последовательность английских слов.
источник
Код Морзе на самом деле является троичным кодом, а не двоичным кодом, поэтому пробелы необходимы. Если бы пробелов не было, возникла бы большая двусмысленность, не столько со всем сообщением, сколько с отдельными буквами.
Например, 2 точки - это I, а 3 точки - это S. Если вы транскрибируете и слышите две точки, вы сразу пишете «I» или ждете, пока не услышите еще одну точку (или тире)?
Ответ в том, что каждое значение разделено пробелами, поэтому они сгруппированы вместе. Когда операторы вводят сообщения Морзе, они делают паузу той же длины, что и тире после каждой последовательности буквенных кодов, чтобы указать конец последовательности.
Даже если бы вы написали программу ИИ, чтобы посмотреть на полное предложение за раз и выяснить, какова была логическая интерпретация сообщения, все равно было бы много мелких двусмысленностей и ошибок в написании
источник
несколько заметок, не охваченных в других (хороших) ответах, но которые, как правило, не исследуют предыдущие знания и не цитируют какие-либо вещи (для меня неотъемлемая часть информатики ).
эта общая теория CS относится к категории сегментации текста, а также к «разделению слов» / «устранению неоднозначности», хотя теория немного отличается, она касается разделения последовательностей символов на слова (с переменными буквами) и т. д., где символы являются единицами. здесь строки разбиты на буквы, где буквы имеют переменную длину, но теория аналогична, хотя не совсем 1-1. то есть отображение между предложениями в слова, переменными словами, длинами букв и предложениями в словах, переменными словами / длинами букв.
как уже отмечали другие, это можно изучить эмпирически. и кто-то сделал это под одним углом (есть несколько способов изучить это) и «опубликовал» результаты на веб-странице с большим каталогом / таблицей результатов.
вау, "контекст имеет значение" ... почти идентичный вопрос "перевод кода Морзе без пробелов" в stackoverflow от 3 лет назад в настоящее время набрал 0 голосов.
источник
В общем, экспоненциально много возможных расшифровок, но если вы действительно хотите, вы можете перечислить их все. Вы также можете перечислить их кратким образом, то есть дать краткое представление для всех из них. Поскольку это не более чем упражнение по программированию, я призываю вас сделать это самостоятельно.
Тем не менее, тот факт, что существует двусмысленность, не исключает возможности расшифровки сообщения или, по крайней мере, больших частей сообщения. Предполагая вероятностную модель для текста, представленного азбукой Морзе - для определенности мы можем предположить, что это английский язык и использовать статистические свойства английского языка - возможно, будет возможно существенно декодировать сообщение, хотя некоторые локальные неоднозначности могут быть неизбежны. Причина в том, что большинство расшифровок соответствуют бессмысленному тексту. Способ сделать это - расширить алгоритм динамического программирования из предыдущего абзаца для оценки вероятности каждого декодирования, а затем выбрать декодирование с максимальной вероятностью. Этот подход имеет больше шансов на успех, поскольку сообщение становится длиннее.
источник
Как определить / распознать / сгенерировать язык всех возможных расшифровок.
Ясно, что без пробелов код Морзе больше не является уникально дешифруемым.
Однако в сжатой форме можно дать все возможные способы его расшифровки. На самом деле это похоже на то, что делается при обработке речи: из уникального потока звуков (или фонем) вы должны найти все способы, которыми он может быть разложен в последовательность слов. Алгоритмы для этого производят так называемую решетку слов. Вы найдете пример в разделе «лексическая неоднозначность» этого ответа .
В случае двоичного кода Морзе (без пробелов) у вас есть только точки и тире, но проблема та же.
Вы можете получить все переводы следующим образом.
Детали легко проработаны. Но спросите, нужно ли вам больше.
источник
Некоторый псевдокод для решателя, который даст все возможные интерпретации. Это основано на нескольких быстрых мыслях, так что дополнительный вклад будет приветствоваться. Метод принимает два ввода: один текст переведен, а второй - азбукой Морзе.
Это выведет все возможные комбинации букв и цифр без пробелов между словами. Если бы вы хотели доказать двусмысленность, это, безусловно, сделало бы это. Если вы хотите получить несколько значимых сообщений, попробуйте поискать код, предназначенный для перевода хэштегов на читаемый язык.
Используя вышеизложенное, я написал программу на C #, которая выполняет все вышеперечисленное. Я остановил его с 22 миллионами возможностей для вышеупомянутой строки, которая может перевести в привет мир. Эквивалент азбуки Морзе, эквивалентный «Hello», дал 20 569 возможных результатов. Я также не включил номера. Это было бы выше, если бы я позволил им.
источник