Цитирую Дэвида Ричерби из комментариев:
Поскольку ⋅ представляет E и - представляет T, любое сообщение Морзе без пробелов можно интерпретировать как строку в{E,T}∗
Кроме того, поскольку A, I, M и N представлены четырьмя возможными комбинациями двух символов Морзе (⋅-, ⋅⋅, -, -⋅, соответственно), любое сообщение без пробелов также можно интерпретировать как строку в , Обратите внимание, что для любого сообщения Морзе длиной> 1 это отличается от интерпретации Дэвида. Таким образом, единственными сообщениями с уникальными интерпретациями являются сообщения длиной 1 (и, я полагаю, 0, если это считается сообщением), то есть ⋅, представляющий E, и -, представляющий T.{A,I,M,N}∗{E,T}?
Вот некоторый JavaScript, который расскажет вам все возможные интерпретации строки .
и -
. Струны длиной до 22 запускаются менее чем за секунду, но все, что выше этого, начинает работать довольно медленно - я бы, например, не пытался декодировать HELLO WORLD с его помощью. Вы можете открыть консоль JavaScript в своем браузере, вставить ее, а затем вызвать, например decode('......-...-..---')
,. (В этом примере запись # 2446 является предполагаемой строкой "HELLO".)
var decode = function(code) {
var cache = {
'0': ['']
};
for(var start = 0;start < code.length;start++) {
for(var len = 1;len < 6;len++) {
if(start + len > code.length) continue;
if(!cache[start + len]) cache[start + len] = [];
var curCode = code.slice(start, start + len);
if(dict[curCode]) {
for(var i_start = 0;i_start < cache[start].length;i_start++) {
cache[start + len].push(cache[start][i_start] + dict[curCode]);
}
}
}
}
return cache[code.length];
};
var dict = {
'.-': 'A',
'-...': 'B',
'-.-.': 'C',
'-..': 'D',
'.': 'E',
'..-.': 'F',
'--.': 'G',
'....': 'H',
'..': 'I',
'.---': 'J',
'-.-': 'K',
'.-..': 'L',
'--': 'M',
'-.': 'N',
'---': 'O',
'.--.': 'P',
'--.-': 'Q',
'.-.': 'R',
'...': 'S',
'-': 'T',
'..-': 'U',
'...-': 'V',
'.--': 'W',
'-..-': 'X',
'-.--': 'Y',
'--..': 'Z',
'.----': '1',
'..---': '2',
'...--': '3',
'....-': '4',
'.....': '5',
'-....': '6',
'--...': '7',
'---..': '8',
'----.': '9',
'-----': '0'
};
Код для удаления только строк из реальных слов немного длиннее, поэтому я поместил его здесь . Он работает под node.js и ожидает файл в /usr/share/dict/words-2500
. Словарь, который я использую, можно найти здесь . Это не наивно - оно сокращает, так как оно работает намного быстрее на больших входах.
Словарь состоит из списка топ-2500 слов, который я где-то нашел в Интернете, за исключением некоторых 1-, 2- и 3-буквенных комбинаций, которые я считал не словами. Этот алгоритм чувствителен к наличию слишком большого количества коротких слов для выбора и резко замедляется, если вы разрешите, скажем, каждую отдельную букву как слово (я смотрю на вас /usr/share/dict/words
).
Алгоритм заканчивается сортировкой по количеству слов, поэтому «интересные», будем надеяться, будут наверху. Это прекрасно работает HELLO WORLD
, работает меньше секунды и возвращает ожидаемую фразу как первый удар. Из этого я также узнал, что DATA SCIENTIST
(единственная другая фраза, которую я пробовал) азбукой Морзе так же, как NEW REAL INDIA
.
Изменить: я искал более интересные в течение нескольких минут. Слова SPACES
и SWITCH
морсаграммы. Пока что это самая длинная пара из одного слова, которую я нашел.