Citando David Richerby dai commenti:
Poiché ⋅ rappresenta E e - rappresenta T, qualsiasi messaggio Morse senza spazi può essere interpretato come una stringa in { E, T}*
{ A , io, M, N}*{ E, T} ?
Ecco alcuni JavaScript che ti diranno tutte le possibili interpretazioni di una stringa di .
e -
. Stringhe fino alla lunghezza 22 arrivano in meno di un secondo, ma qualsiasi cosa più alta di questa inizia a diventare piuttosto lenta - ad esempio, non proverei a decodificare HELLO WORLD con esso. Puoi aprire una console JavaScript nel tuo browser, incollarla e quindi chiamare, ad esempio decode('......-...-..---')
,. (In questo esempio, la voce # 2446 è la stringa desiderata "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'
};
Il codice per potarlo a sole stringhe di parole reali è un po 'più lungo, quindi l'ho messo qui . Funziona con node.js e si aspetta un file su /usr/share/dict/words-2500
. Il dizionario che sto usando può essere trovato qui . Non è ingenuo: pota mentre procede, quindi corre molto più velocemente su input più grandi.
Il dizionario è costituito da un elenco di 2500 parole che ho trovato su Internet da qualche parte, meno alcune combinazioni di 1, 2 e 3 lettere che non ho considerato parole. Questo algoritmo è sensibile al fatto di avere troppe parole brevi tra cui scegliere e rallenta drasticamente se permetti, diciamo, ogni singola lettera come parola (ti sto guardando /usr/share/dict/words
).
L'algoritmo termina ordinando in base al numero di parole, quindi si spera che quelli "interessanti" siano in cima. Funziona alla grande HELLO WORLD
, correndo in meno di un secondo e restituendo la frase prevista come primo colpo. Da ciò ho anche imparato che DATA SCIENTIST
(l'unica altra frase che ho provato) i codici morse sono gli stessi di NEW REAL INDIA
.
Modifica: ho cercato quelli più interessanti per alcuni minuti. Le parole SPACES
e SWITCH
sono morsagrammi. Finora sono la coppia di parole singole più lunga che abbia mai trovato.