Là mã Morse không có không gian giải mã duy nhất?


54

Có phải tất cả các chuỗi mã Morse đều được giải mã duy nhất? Không có không gian,

......-...-..---.-----.-..-..-..

có thể Hello Worldnhưng có lẽ chữ cái đầu tiên là 5- trong thực tế có vẻ như rất khó có thể là một chuỗi các dấu chấm và dấu gạch ngang tùy ý nên có một bản dịch duy nhất.

Người ta có thể có thể sử dụng bất đẳng thức Kraft nhưng điều đó chỉ áp dụng cho mã tiền tố .

Mã Morse có khoảng trắngmã tiền tố trong đó các thông điệp luôn có thể được giải mã duy nhất. Một khi chúng ta loại bỏ khoảng trắng thì điều này không còn đúng nữa.


Trong trường hợp tôi đúng, và tất cả tin nhắn mã Morse không thể được giải mã duy nhất, có cách nào để liệt kê tất cả các tin nhắn có thể không? Dưới đây là một số bài tập liên quan tôi tìm thấy trên codegolf.SE


7
Bạn dường như đã trả lời câu hỏi của riêng bạn rồi?
Raphael

7
"Mã Morse không có dấu cách" không phải là mã morse. Các khoảng trắng là một phần của đặc tả vì không có chúng, mã không thể giải mã được.
Stephen Kennedy

1
@StephenKennedy Điều đó đã có trong câu hỏi. Bạn đã đọc nó hoàn toàn?
Raphael

3
Kịch bản Perl để liệt kê các thông điệp có thể cho một mã. Không nhận ra đây là một cộng đồng lý thuyết thuần túy. :)
Squeezy

1
Bạn có thực sự chắc chắn rằng câu trả lời được chấp nhận của bạn đủ điều kiện là một câu trả lời, hoặc thậm chí là một gợi ý cho bất cứ điều gì? Ý tôi là rõ ràng là ET = A ... điều đó chứng tỏ rằng Spielberg đã đúng: ET là người ngoài hành tinh.
babou

Câu trả lời:


91

Sau đây là cả hai thông điệp hợp lý, nhưng có một ý nghĩa hoàn toàn khác nhau:

SOS HELP      = ...---...  .... . .-.. .--.        => ...---.........-...--.
I AM HIS DATE = ..  .- --  .... .. ...  -.. .- - . => ...---.........-...--.

6
Dễ thương nhưng đã được xác định rằng Morse không có không gian là mơ hồ nên tôi thực sự không nghĩ rằng điều này đáng giá hơn nhiều so với một nhận xét.
David Richerby

37
OP dường như được hỏi liệu một loạt các dấu chấm và dấu gạch ngang không gian có thể được hiểu là hai thông điệp "thật" như trái ngược với trình tự độc đoán của TE . SOS đầu tiên ! Cứu giúp! gồm hai từ xen kẽ và lần thứ hai tôi là ngày của anh ấy là một câu tiếng Anh đúng ngữ pháp và hợp lý nên cả hai đều là những thông điệp hợp lệ. Điều này trả lời câu hỏi ngắn gọn bằng cách cung cấp một ví dụ.
CJ Dennis

2
@CJDennis Câu hỏi không nói lên điều đó. Nó hỏi liệu chuỗi Morse có được giải mã duy nhất không và liệu có cách nào liệt kê tất cả các chuỗi mã theo một chuỗi đã cho nếu dấu chấm và dấu gạch ngang. Nó không nói gì về các chuỗi phải có nghĩa trong tiếng Anh.
David Richerby

2
có cả một ví dụ (phản biện) cụ thể và một cách chung để nghiên cứu vấn đề và cả hai đều có liên quan đến câu trả lời hay. xem ví dụ bằng chứng / phản bác của lakatos
vzn

3
"Nó nói gì, ký hiệu?" I AM HIS DATE"Vì vậy, Amelia quyết định bỏ trốn với Noonan cũ , hmmm. Có lẽ chúng ta nên giữ điều này cho riêng mình."
dotancohen

36

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 .-. 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ừ SPACESSWITCHlà morsagram. Cho đến nay chúng là cặp từ đơn dài nhất mà tôi tìm thấy.


3
Bạn vừa phát minh ra từ morsagram ? Tôi rất thích nó, nhưng một tìm kiếm trên web cung cấp một liên kết duy nhất - đến trang web này.
BmyGuest

Tôi cũng đã tự do biến câu hỏi thú vị này thành một thử thách mở trên Puzzling.SE với một số tài liệu tham khảo trở lại bài đăng này ở đây.
BmyGuest

@BmyGuest Vâng, đó là một từ hoàn toàn được tạo ra. Tôi thích nó, mặc dù.
Aaron Dufour

17

Nó là đủ để quan sát rằng các kết hợp ngắn nhất định của các chữ cái cho phép giải mã mơ hồ. Một chuỗi mơ hồ duy nhất đủ, nhưng tôi có thể thấy như sau:

ATE ~ P
EA ~ IT
MO ~ OM

v.v ... Như David Richerby ghi chú trong các bình luận, bất kỳ chữ cái nào cũng tương đương với một chuỗi Es và Ts, khiến Mã Morse mơ hồ như một cách mã hóa các chuỗi chữ cái tùy ý; các kết hợp trên cho thấy rằng điều này đúng ngay cả với các kết hợp chữ cái hợp lý trong tiếng Anh (ví dụ: MEAT~ MITT). Có lẽ một bài tập mã hóa thú vị sẽ là tìm tất cả các chuỗi năm hoặc ít hơn các chữ cái có thể bị nhầm lẫn với một thứ khác, hạn chế các tổ hợp chữ cái có thể thực sự được tìm thấy trong văn bản tiếng Anh (sử dụng một hoặc nhiều từ), được nhóm theo lớp tương đương.

Sử dụng ví dụ ban đầu của bạn, nó cũng xảy ra trường hợp

HELLO WORLD ~ HAS TEAM NO MAID TOE

và trong khi phía bên tay phải có lẽ không thực tế dù chỉ là một phần tin nhắn, thì đó chắc chắn là một chuỗi các từ tiếng Anh, và một từ có thể được tìm thấy trong vòng chưa đầy 15 phút mà không cần sự trợ giúp của máy tính. Điều này có thể được coi là bằng chứng cho thấy nhiều cụm từ trong tiếng Anh có thể bị hiểu sai thành một chuỗi các từ tiếng Anh khác nhau (có thể vô nghĩa).


MT vs TM là một ví dụ rất ngắn.
Raphael

2
@Raphael MT == TM == O Cả ba đều là cùng một chuỗi. Điều đó làm cho nó rất khó dịch.
Red_Shadow

10

Mã Morse thực sự là một mã ternary, không phải là mã nhị phân, vì vậy các khoảng trắng là cần thiết. Nếu không có chỗ trống, sẽ có rất nhiều sự mơ hồ, không nhiều với toàn bộ tin nhắn, nhưng với các chữ cái riêng lẻ.

Ví dụ: 2 dấu chấm là chữ I, nhưng 3 dấu chấm là chữ S. Nếu bạn đang phiên âm và bạn nghe thấy hai dấu chấm, bạn có ngay lập tức viết "Tôi" hay bạn đợi cho đến khi bạn nghe thấy một dấu chấm khác (hoặc dấu gạch ngang)?

Câu trả lời là mỗi giá trị được phân tách không gian để chúng được nhóm lại với nhau. Khi các toán tử khóa thông điệp trong Morse, chúng tạo một khoảng dừng có cùng độ dài với dấu gạch ngang sau mỗi chuỗi mã chữ cái để chỉ ra kết thúc của chuỗi.

Ngay cả khi bạn đã viết một chương trình AI để xem xét một câu đầy đủ tại một thời điểm và tìm ra cách giải thích hợp lý của thông điệp, vẫn sẽ có nhiều sự mơ hồ và sai chính tả.


2
Câu cuối cùng của bạn dường như đã bị cắt ngắn.
David Richerby

2
@DavidR Richby Vâng, đó là vì tôi đã cố gắng tạo bài đăng bằng Mã Morse không có khoảng trắng.
Tyler Durden

4

một vài lưu ý không được đề cập trong các câu trả lời (tốt) khác nhưng thường không nghiên cứu kiến ​​thức trước và trích dẫn bất kỳ nội dung nào (với tôi một phần nội tại của khoa học máy tính ).

  • lý thuyết chung này về CS rơi vào loại phân đoạn văn bản và cả "phân tách từ" / "định hướng" mặc dù lý thuyết này có một chút khác biệt, về việc phân tách các chuỗi ký hiệu thành các từ (với các chữ cái thay đổi), v.v. là các đơn vị. ở đây, các chuỗi được chia thành các chữ cái trong đó các chữ cái có độ dài thay đổi, nhưng lý thuyết là tương tự mặc dù không chính xác 1-1. tức là ánh xạ giữa các câu-thành-từ, biến-từ-chữ-độ dài và câu-thành-từ, biến-từ / chữ-độ dài.

  • như những người khác đã chỉ ra điều này có thể được nghiên cứu theo kinh nghiệm. và ai đó đã làm điều đó từ một góc độ (có nhiều cách để nghiên cứu điều này) và "công bố" kết quả trên một trang web với một thư mục / bảng kết quả lớn.

    Tôi tìm thấy 25.787 từ mã Morse mơ hồ. Điều này được làm bằng 10.330 chuỗi Morse riêng biệt. Từ Morse mơ hồ tần số cao nhất có 13 từ nhà tài trợ có thể. Các kết quả được nhóm dưới đây trong các bảng dựa trên tần suất của các từ có cùng đại diện Morse.

  • wow, "vấn đề bối cảnh" ... một câu hỏi gần như giống hệt nhau "dịch mã morse không có khoảng trắng" trên stackoverflow từ 3yrs trước hiện có 0 phiếu.


2

Nói chung có nhiều giải mã theo cấp số nhân, nhưng nếu bạn thực sự muốn, bạn có thể liệt kê tất cả. Bạn cũng có thể liệt kê chúng một cách cô đọng, nghĩa là đưa ra một đại diện cô đọng cho tất cả chúng. Vì đây không gì khác hơn là một bài tập lập trình, tôi thách bạn tự làm.

Điều đó nói rằng, thực tế là có sự mơ hồ không loại trừ khả năng giải mã tin nhắn, hoặc ít nhất là phần lớn của tin nhắn. Giả sử một mô hình xác suất cho văn bản được biểu thị bằng mã Morse - để chắc chắn, chúng ta có thể giả sử rằng đó là tiếng Anh và sử dụng các thuộc tính thống kê của tiếng Anh - về cơ bản có thể giải mã được thông điệp, mặc dù một số sự mơ hồ cục bộ có thể không thể tránh khỏi. Lý do là hầu hết các giải mã tương ứng với văn bản gốc không có ý nghĩa. Cách thực hiện là mở rộng thuật toán lập trình động từ đoạn trước để ước tính khả năng của mỗi giải mã, sau đó chọn khả năng giải mã tối đa. Cách tiếp cận này có nhiều cơ hội để thành công hơn khi thông điệp dài hơn.


Không những thuật toán Viterbi làm điều gì đó tương tự như những gì bạn mô tả? Định lượng sự tăng trưởng theo cấp số nhân của số lượng giải mã, đó có phải là một câu hỏi thích hợp cho đây không, hay cstheory.SE?
john mangual

1
Đúng vậy, ý tưởng là sử dụng lập trình động. Ước tính sự tăng trưởng theo cấp số nhân có lẽ phù hợp ở đây tốt hơn cstheory.
Yuval Filmus

trên thực tế, điều này rất giống với những gì được thực hiện để xác định các từ trong xử lý lời nói. Kết quả là cái được gọi là mạng từ, đó là một biểu diễn cô đọng của tất cả các chuỗi từ có thể khớp với chuỗi âm thanh được phân tích.
babou

1

Làm thế nào để xác định / nhận biết / tạo ngôn ngữ của tất cả các giải mã có thể.

Rõ ràng, không có khoảng trắng, mã morse không còn được giải mã duy nhất.

Tuy nhiên, có thể đưa ra một hình thức cô đọng tất cả các cách có thể để giải mã nó. Điều này thực sự giống với những gì được thực hiện trong xử lý lời nói: từ một luồng âm thanh (hoặc âm vị) duy nhất, bạn phải tìm tất cả các cách có thể phân tách trong một chuỗi các từ. Các thuật toán để làm điều này tạo ra cái được gọi là mạng từ. Bạn sẽ tìm thấy một ví dụ trong phần "mơ hồ từ vựng" của câu trả lời này .

Trong trường hợp mã Morse nhị phân (không có dấu cách), bạn chỉ có dấu chấm và dấu gạch ngang, nhưng vấn đề là như nhau.

Cách bạn có thể nhận được tất cả các bản dịch là như sau.

Trước tiên, bạn xây dựng Máy tuần tự tổng quát (GSM) giải mã câu Morse. Đây có thể dễ dàng đạt được bằng cách xây dựng một Trie công nhận mã Morse. Khi một mã được nhận dạng, chữ cái / chữ số tương ứng là đầu ra và có (không xác định) một chuyển tiếp trống trở lại gốc của bộ ba. Nhưng đồng thời, từ mã có thể được tiếp tục thành một từ dài hơn (không xác định).T

Sau đó, bạn hãy tự Morse của bạn của dấu gạch ngang và dấu chấm, và bạn đọc nó như là một automaton tuyến tính hữu hạn nhà nước với bang (các vị trí giữa các dấu gạch ngang và dấu chấm, từ đến ) mà tạo ra câu độc đáo này, tức là ngôn ngữ đơn lẻ . Những gì bạn muốn là ngôn ngữ của tất cả các bản dịch . Bạn biết từ các định lý chung rằng, vì L là hữu hạn, do đó thường xuyên và do các ngôn ngữ thông thường được đóng dưới ánh xạ GSM, nên ngôn ngữ là chính quy. Vì vậy, những gì bạn thực sự muốn là một FSA nhận ra (hoặc tạo ra) ngôn ngữ đó.n W n + 1 0 n L = { w } = L ( W ) T ( L ) T ( L )wnWn+10nL={w}=L(W)T(L)T(L)

Vì mục đích đó, bạn chỉ có thể áp dụng một cấu trúc cross-sản phẩm tiêu chuẩn, tương tự như một trong những sử dụng cho các giao điểm của hai ngôn ngữ thông thường, với hai finites khẳng định các thiết bị và . Việc chuyển đổi được lựa chọn để bạn bắt chước cả đầu dò và FSA . Bạn dễ dàng có được một FSA xác định ngôn ngữ thông thường của tất cả các bản dịch.W T WTWTW

Các chi tiết dễ dàng làm việc ra. Nhưng hỏi nếu bạn cần thêm.


0

Một số mã giả cho một người giải sẽ đưa ra tất cả các giải thích có thể. Điều này dựa trên một vài suy nghĩ nhanh, vì vậy đầu vào bổ sung sẽ được hoan nghênh. Phương thức chấp nhận hai đầu vào một trong những văn bản đã được dịch và thứ hai là mã morse.

MorseSolver (string textSoFar, string codeRemaining)
{
    if(codeRemaining length == 0) output textSoFar
    else
    {
        codeLength = length of code remaining
        read 1 through (min of 5 or codeLength) characters from codeRemaining
        for each set of characters
        {
            call an IsMorseCode method that checks if the characters 
              input are valid morse code
            if they are valid add the translated character to textSoFar 
              and remove the characters from codeRemaining, then call 
              the MorseSolver again with the new strings)
        }

}

Điều này sẽ xuất ra tất cả các kết hợp có thể có của các chữ cái và số mà không có bất kỳ khoảng cách nào giữa "từ". Nếu bạn muốn chứng minh sự mơ hồ, điều này chắc chắn sẽ làm điều đó. Nếu bạn muốn nhận được một số thông điệp có ý nghĩa, thì hãy thử tìm mã có nghĩa là dịch hashtags sang ngôn ngữ có thể đọc được.

Sử dụng ở trên, tôi đã viết một chương trình trong C # mà thực hiện ở trên. Tôi đã ngăn nó chạy ở 22 triệu khả năng cho chuỗi trên có thể dịch sang hello world. Mã Morse tương đương với "Xin chào" đã mang lại 20.569 kết quả có thể. Tôi cũng không bao gồm các số. Điều đó sẽ cao hơn nếu tôi cho phép họ.


Đầu ra của một thuật toán như vậy sẽ là một bằng chứng cho thấy bất kỳ chuỗi riêng lẻ nào đều mơ hồ nhưng nó sẽ không chứng minh rằng tất cả các chuỗi đều mơ hồ.
David Richerby

@DavidR Richby Tất cả các chuỗi có độ dài> 1 đều mơ hồ. Điều đó đã được chứng minh ở những nơi khác trên trang này. Tôi đã cố gắng trả lời phần thứ hai của câu hỏi và cung cấp một phương tiện để ngoại suy tất cả các giải pháp có thể từ một chuỗi.
Red_Shadow

Vì tò mò, bạn có muốn chia sẻ chương trình C # của mình không? Phiên bản Perl của tôi đưa ra 19796 giải pháp khả thi cho tương đương "HELLO". Có lẽ tôi đã quên xuất ra một số trường hợp mặc dù ...
Squeezy

1
Mã nguồn thực sự là không chính thức ở đây; vui lòng xuất bản nó ở nơi khác (pastebin, Gist, ...) và chỉ liên kết với nó.
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.