Mengutip David Richerby dari komentar:
Karena ⋅ mewakili E dan - mewakili T, pesan Morse apa pun tanpa spasi dapat diartikan sebagai string dalam { E, T}∗
Lebih lanjut, karena A, I, M, dan N diwakili oleh empat kemungkinan kombinasi dari dua karakter morse (⋅-, ⋅⋅, -, -⋅, masing-masing), pesan apa pun tanpa spasi juga dapat diartikan sebagai string dalam { A , saya, M., N}∗{ E, T} ?. Perhatikan bahwa untuk setiap pesan Morse dengan panjang> 1, ini berbeda dari interpretasi David. Dengan demikian, satu-satunya pesan dengan interpretasi unik adalah yang panjangnya 1 (dan, saya kira, 0, jika itu dianggap sebagai pesan) - yaitu, ⋅, mewakili E, dan -, mewakili T.
Berikut ini beberapa JavaScript yang akan memberi tahu Anda semua kemungkinan interpretasi dari serangkaian .
dan -
. String dengan panjang hingga 22 berjalan di bawah satu detik, tetapi sesuatu yang lebih tinggi dari itu mulai menjadi sangat lambat - Saya tidak akan, misalnya, mencoba untuk memecahkan kode HELLO WORLD dengan itu. Anda dapat membuka konsol JavaScript di browser Anda, menempelkannya di, dan kemudian memanggil, misalnya,decode('......-...-..---')
,. (Dalam contoh ini, entri # 2446 adalah string yang dimaksud "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'
};
Kode untuk memangkasnya menjadi hanya untaian kata-kata nyata sedikit lebih lama, jadi saya taruh di sini . Ini berjalan di bawah node.js dan mengharapkan file di /usr/share/dict/words-2500
. Kamus yang saya gunakan dapat ditemukan di sini . Ini tidak naif - itu memangkas saat berjalan, sehingga berjalan jauh lebih cepat pada input yang lebih besar.
Kamus ini terdiri dari daftar 2.500 kata teratas yang saya temukan di internet di suatu tempat, minus beberapa kombinasi 1-, 2-, dan 3- huruf yang saya anggap bukan kata-kata. Algoritme ini sensitif untuk memiliki terlalu banyak kata pendek untuk dipilih, dan melambat secara drastis jika Anda mengizinkan, katakanlah, setiap huruf sebagai kata (Saya melihat Anda,/usr/share/dict/words
).
Algoritma selesai dengan mengurutkan berdasarkan jumlah kata, sehingga yang "menarik" diharapkan akan berada di atas. Ini berfungsi dengan baik HELLO WORLD
, berjalan di bawah satu detik dan mengembalikan frase yang diharapkan sebagai hit pertama. Dari sini saya juga belajar bahwa DATA SCIENTIST
(satu-satunya frasa lain yang saya coba) kode morse sama dengan NEW REAL INDIA
.
Sunting: Saya mencari yang lebih menarik selama beberapa menit. Kata-kata SPACES
dan SWITCH
morsagram. Sejauh ini mereka adalah pasangan kata tunggal terpanjang yang saya temukan.