Citando a David Richerby de los comentarios:
{E,T}∗
{A,I,M,N}∗{E,T}?
Aquí hay algunos JavaScript que le indicarán todas las posibles interpretaciones de una cadena de .
y -
. Cadenas de hasta 22 de longitud se ejecutan en menos de un segundo, pero cualquier cosa más alta que eso comienza a ser bastante lenta; por ejemplo, no trataría de decodificar HELLO WORLD con ella. Puede abrir una consola JavaScript en su navegador, pegar esto y luego llamar, por ejemplo decode('......-...-..---')
,. (En este ejemplo, la entrada # 2446 es la cadena deseada "HOLA").
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'
};
El código para podarlo solo a cadenas de palabras reales es un poco más largo, así que lo puse aquí . Se ejecuta en node.js y espera un archivo en /usr/share/dict/words-2500
. El diccionario que estoy usando se puede encontrar aquí . No es ingenuo: se poda a medida que avanza, por lo que funciona mucho más rápido en entradas más grandes.
El diccionario consta de una lista de las 2500 palabras principales que encontré en Internet en alguna parte, menos algunas combinaciones de 1, 2 y 3 letras que no consideré palabras. Este algoritmo es sensible a tener demasiadas palabras cortas para elegir, y se ralentiza drásticamente si permite, por ejemplo, cada letra individual como palabra (lo estoy mirando,/usr/share/dict/words
).
El algoritmo termina ordenando según el número de palabras, por lo que las "interesantes" estarán en la parte superior. Esto funciona muy bien HELLO WORLD
, se ejecuta en menos de un segundo y devuelve la frase esperada como el primer éxito. De esto también aprendí que DATA SCIENTIST
(la única otra frase que probé) codifica morse igual que NEW REAL INDIA
.
Editar: Busqué más interesantes durante unos minutos. Las palabras SPACES
y SWITCH
son morsagramas. Hasta ahora son el par de una sola palabra más largo que he encontrado.