Цитуючи Девіда Річербі з коментарів:
Оскільки ⋅ являє собою E і - являє собою T, будь-яке повідомлення Морзе без пробілів можна інтерпретувати як рядок у { Е, Т}∗
{ А , я, М, N}∗{ Е, Т} ?
Ось деякий JavaScript, який розповість про всі можливі інтерпретації рядка .
та -
. Струни довжиною до 22 запускаються за секунду, але все, що вище, починається досить повільно - я б, наприклад, не намагався розшифрувати НЕЙНИЙ МИР. Ви можете поп відкрити консоль 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
є морсаграмами. Поки вони найдовша пара, яку я знайшов.