Citant David Richerby des commentaires:
Puisque ⋅ représente E et - représente T, tout message Morse sans espaces peut être interprété comme une chaîne dans{E,T}∗
De plus, puisque A, I, M et N sont représentés par les quatre combinaisons possibles de deux caractères morse (-, ⋅⋅, -,-,, respectivement), tout message sans espace peut également être interprété comme une chaîne dans . Notez que pour tout message Morse de longueur> 1, ceci est distinct de l'interprétation de David. Ainsi, les seuls messages avec des interprétations uniques sont ceux de longueur 1 (et, je suppose, 0, si cela compte comme un message) - c’est-à-dire, ⋅, représentant E, et -, représentant T.{A,I,M,N}∗{E,T}?
Voici un code JavaScript qui vous indiquera toutes les interprétations possibles d’une chaîne de caractères .
et -
. Des chaînes allant jusqu'à 22 longueurs en moins d'une seconde, mais tout ce qui est plus élevé commence à devenir assez lent - je ne voudrais pas, par exemple, essayer de décoder HELLO WORLD avec. Vous pouvez ouvrir une console JavaScript dans votre navigateur, la coller puis appeler, par exemple decode('......-...-..---')
. (Dans cet exemple, l'entrée n ° 2446 correspond à la chaîne "BONJOUR".)
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'
};
Le code pour l'élaguer aux chaînes de mots réels est un peu plus long, donc je le mets ici . Il fonctionne sous node.js et attend un fichier à /usr/share/dict/words-2500
. Le dictionnaire que j'utilise peut être trouvé ici . Ce n'est pas naïf - il taille au fur et à mesure, de sorte qu'il fonctionne beaucoup plus vite avec des entrées plus volumineuses.
Le dictionnaire contient une liste de 2 500 mots que j'ai trouvés sur Internet quelque part, moins certaines combinaisons de 1, 2 et 3 lettres que je considérais comme non pas des mots. Cet algorithme est sensible à la possibilité de choisir un trop grand nombre de mots courts et ralentit considérablement si vous autorisez, disons, chaque lettre en tant que mot (je vous regarde, /usr/share/dict/words
).
L'algorithme finit par trier en fonction du nombre de mots, donc les "intéressants" seront, espérons-le, au sommet. Cela fonctionne très bien HELLO WORLD
, en moins d’une seconde et en retournant la phrase attendue comme premier coup. De cela, j’ai aussi appris que DATA SCIENTIST
(la seule autre phrase que j’ai essayée) les codes morse sont les mêmes que NEW REAL INDIA
.
Edit: J'ai cherché d'autres plus intéressantes pendant quelques minutes. Les mots SPACES
et SWITCH
sont des morsagrammes. Jusqu'à présent, ils constituent la plus longue paire à mot unique que j'ai trouvée.