Cytując Davida Richerby'ego z komentarzy:
{E,T}∗
{A,I,M,N}∗{E,T}?
Oto kilka skryptów JavaScript, które pokażą wszystkie możliwe interpretacje ciągu .
i -
. Ciągi o długości do 22 biegną w czasie krótszym niż sekunda, ale wszystko, co jest większe, zaczyna być dość wolne - na przykład nie próbowałbym dekodować za jego pomocą HELLO WORLD. Możesz otworzyć konsolę JavaScript w przeglądarce, wkleić to, a następnie zadzwonić na przykład decode('......-...-..---')
. (W tym przykładzie pozycja # 2446 jest zamierzonym ciągiem „CZEŚĆ”).
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'
};
Kod do przycinania tylko ciągów prawdziwych słów jest nieco dłuższy, więc umieściłem go tutaj . Działa pod node.js i oczekuje pliku o /usr/share/dict/words-2500
. Słownik, którego używam, można znaleźć tutaj . Nie jest naiwny - przycina się, więc działa znacznie szybciej przy większych nakładach.
Słownik składa się z listy 2500 słów, które znalazłem gdzieś w Internecie, pomniejszonej o kombinacje 1, 2 i 3 liter, które uważałem za nie słowa. Ten algorytm jest wrażliwy na zbyt wiele krótkich słów do wyboru i drastycznie spowalnia, jeśli pozwolisz, powiedzmy, na każdą literę jako słowo (patrzę na ciebie /usr/share/dict/words
).
Algorytm kończy się sortowaniem na podstawie liczby słów, więc „interesujące” będą, mam nadzieję, na górze. Działa to świetnie HELLO WORLD
, działa w mniej niż sekundę i zwraca oczekiwane wyrażenie jako pierwsze trafienie. Z tego dowiedziałem się również, że DATA SCIENTIST
(jedyne inne zdanie, którego próbowałem) Morse koduje to samo co NEW REAL INDIA
.
Edycja: szukałem ciekawszych przez kilka minut. Słowa SPACES
i SWITCH
są morsagramy. Jak dotąd są to najdłuższe pary pojedynczych słów, jakie znalazłem.