Trích dẫn David Richerby từ các ý kiến:
Vì ⋅ đại diện cho E và - đại diện cho T, bất kỳ thông điệp Morse nào không có khoảng trắng đều có thể được hiểu là một chuỗi trong{E,T}∗
Hơn nữa, vì A, I, M và N được biểu thị bằng bốn kết hợp có thể có của hai ký tự morse (-,, -, -⋅, tương ứng), bất kỳ thông điệp nào không có khoảng trắng cũng có thể được hiểu là một chuỗi trong . Lưu ý rằng đối với mọi thông điệp Morse có độ dài> 1, điều này khác với cách giải thích của David. Do đó, các thông điệp duy nhất có cách hiểu duy nhất là các thông báo có độ dài 1 (và, tôi cho rằng, 0, nếu đó được tính là một tin nhắn) - nghĩa là, representing, đại diện cho E và -, đại diện cho T.{A,I,M,N}∗{E,T}?
Đây là một số JavaScript sẽ cho bạn biết tất cả các giải thích có thể có của một chuỗi .
và -
. Các chuỗi có độ dài lên đến 22 chạy trong một giây, nhưng bất cứ điều gì cao hơn mức đó bắt đầu trở nên khá chậm - ví dụ, tôi sẽ không cố gắng giải mã HELLO WORLD với nó. Bạn có thể bật mở bảng điều khiển JavaScript trong trình duyệt của mình, dán ứng dụng này vào, sau đó gọi, ví dụ , decode('......-...-..---')
. (Trong ví dụ này, mục số 2446 là chuỗi dự định "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'
};
Mã để cắt nó thành chuỗi các từ thực sự dài hơn một chút, vì vậy tôi đặt nó ở đây . Nó chạy dưới node.js và mong đợi một tệp tại /usr/share/dict/words-2500
. Từ điển tôi đang sử dụng có thể được tìm thấy ở đây . Nó không ngây thơ - nó cắt tỉa khi nó đi, vì vậy nó chạy nhanh hơn nhiều trên các đầu vào lớn hơn.
Từ điển bao gồm một danh sách 2500 từ hàng đầu tôi tìm thấy trên internet ở đâu đó, trừ một số tổ hợp chữ 1-, 2- và 3- mà tôi cho là không phải từ. Thuật toán này rất nhạy cảm với việc có quá nhiều từ ngắn để lựa chọn và làm chậm đi đáng kể nếu bạn cho phép, nói, mỗi chữ cái riêng lẻ như một từ (tôi đang nhìn bạn, /usr/share/dict/words
).
Thuật toán kết thúc bằng cách sắp xếp dựa trên số lượng từ, vì vậy những từ "thú vị" hy vọng sẽ đứng đầu. Điều này hoạt động rất tốt HELLO WORLD
, chạy trong một giây và trả lại cụm từ dự kiến là lần truy cập đầu tiên. Từ đó tôi cũng học được rằng DATA SCIENTIST
(cụm từ duy nhất khác tôi đã thử) morse mã giống như NEW REAL INDIA
.
Chỉnh sửa: Tôi đã tìm kiếm những cái thú vị hơn trong vài phút. Các từ SPACES
và SWITCH
là morsagram. Cho đến nay chúng là cặp từ đơn dài nhất mà tôi tìm thấy.