Citando David Richerby dos comentários:
{E,T}∗
{A,I,M,N}∗{E,T}?
Aqui está um JavaScript que mostra todas as interpretações possíveis de uma sequência de caracteres de .
e -
. Seqüências de caracteres de até 22 caracteres são executadas em menos de um segundo, mas qualquer coisa maior do que isso começa a ficar bem lenta - eu não tentaria, por exemplo, decodificar HELLO WORLD com ela. Você pode abrir um console JavaScript no navegador, colá-lo e chamar, por exemplo decode('......-...-..---')
,. (Neste exemplo, a entrada # 2446 é a sequência pretendida "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'
};
O código para removê-lo apenas para seqüências de palavras reais é um pouco mais longo, então eu o coloco aqui . Ele é executado em node.js e espera um arquivo em /usr/share/dict/words-2500
. O dicionário que estou usando pode ser encontrado aqui . Não é ingênuo - corta como vai, por isso corre muito mais rápido em entradas maiores.
O dicionário consiste em uma lista das 2.500 palavras que encontrei na Internet em algum lugar, menos algumas combinações de 1, 2 e 3 letras que não considerava palavras. Esse algoritmo é sensível a ter muitas palavras curtas para escolher e diminui drasticamente se você permitir, digamos, cada letra individual como uma palavra (estou olhando para você /usr/share/dict/words
).
O algoritmo termina classificando com base no número de palavras, portanto, as "interessantes" devem estar no topo. Isso funciona muito bem HELLO WORLD
, rodando em menos de um segundo e retornando a frase esperada como o primeiro hit. Com isso, também aprendi que DATA SCIENTIST
(a única outra frase que tentei) os códigos morse são iguais a NEW REAL INDIA
.
Edit: Eu procurei por mais interessantes por alguns minutos. As palavras SPACES
e SWITCH
são morsagramas. Até agora, eles são o par mais longo de uma palavra que encontrei.