공백이없는 모스 부호는 고유하게 해독 할 수 있습니까?


54

모든 Morse 코드 문자열은 고유하게 해독 할 수 있습니까? 공백이 없으면

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

될 수 Hello World있지만, 아마도 첫 글자가입니다 5- 실제로는 고유의 번역을해야 점과 대시 매우 가능성이 임의의 순서를 보인다.

크래프트 불평등을 사용할 수도 있지만 접두사 코드 에만 적용됩니다 .

공백 이있는 모스 코드 는 메시지를 항상 고유하게 디코딩 할 수있는 접두사 코드 입니다. 공백을 제거하면 더 이상 사실이 아닙니다.


내가 옳고 모든 Morse 코드 메시지를 고유하게 디코딩 할 수없는 경우 가능한 모든 메시지를 나열하는 방법이 있습니까? codegolf.SE에서 찾은 관련 운동이 있습니다.


7
당신은 이미 당신 자신의 질문에 대답 한 것 같습니까?
Raphael

7
"공백이없는 모스 코드"는 모스 코드가 아닙니다. 공백이 없으면 코드를 해독 할 수 없으므로 공백이 사양의 일부입니다.
Stephen Kennedy

1
@StephenKennedy 그것은 이미 의문의 여지가 있습니다. 당신은 그것을 완전히 읽었습니까?
Raphael

3
코드의 가능한 메시지를 나열하는 Perl 스크립트 . 이것이 순전히 이론적 인 공동체라는 것을 몰랐다. :)
Squeezy

1
당신이 받아 들인 대답이 전혀 답으로, 또는 어떤 힌트라도 될 자격이 있다고 확신합니까? 나는 ET = A라는 것이 분명하다는 것을 의미합니다 ... 그것은 Spielberg가 옳았음을 증명합니다 : ET는 외계인입니다.
babou

답변:


91

다음은 그럴듯한 메시지이지만 완전히 다른 의미를 갖습니다.

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

6
귀엽지 만 공백이없는 모스가 모호하다는 것이 이미 확립되어 있으므로 실제로 이것이 주석보다 훨씬 가치가 있다고 생각하지 않습니다.
David Richerby 2014

37
OP는 공백이없는 일련의 점과 대시가 임의의 TE 시퀀스와 달리 두 개의 "실제"메시지로 해석 될 수 있는지 묻고있는 것 같습니다 . 첫 SOS! 도움! 두 개의 묵인으로 구성되어 있고 두 번째로 그의 날짜 는 문법적이고 현명한 영어 문장이므로 둘 다 유효한 메시지입니다. 이것은 예제를 제공함으로써 간결하게 질문에 대답합니다.
CJ Dennis

2
@CJDennis 질문은 전혀 그렇지 않습니다. Morse 문자열이 고유하게 해독 가능한지 여부와 도트와 대시가있는 경우 주어진 시퀀스로 코딩되는 모든 문자열을 나열하는 방법이 있는지 묻습니다. 그것은 영어로 의미가 있어야하는 문자열에 대해 전혀 말하지 않습니다.
David Richerby

2
둘 다를이 특정 (카운터) 예와 일반적인 문제를 공부하는 방법 모두 좋은 답변 (들)와 관련이있는가. 예 : lakatos의 증명 / 반박 참조
vzn

3
"사인이란 무엇입니까?" I AM HIS DATE"따라서 아멜리아 는 낡은 누난 과 함께 가기로 결정했습니다 . 흠. 우리는 아마 이것을 우리 자신에게 보관해야합니다."
dotancohen

36

의견에서 David Richerby를 인용 :

⋅는 E를, −는 T를 나타내므로 공백이없는 모스 메시지는 에서 문자열로 해석 될 수 있습니다.{E,T}

또한 A, I, M 및 N은 두 개의 모스 문자 (각각 ⋅-, ⋅⋅,-, -⋅)의 네 가지 가능한 조합으로 표시되므로 공백이없는 모든 메시지는 문자열로 해석 될 수 있습니다. . 길이가 1보다 큰 Morse 메시지의 경우 David의 해석과는 다릅니다. 따라서 고유 한 해석을 가진 유일한 메시지는 길이 1 (메시지로 간주되는 경우 0)-즉 E를 나타내는 ⋅-T를 나타내는 것으로 가정합니다.{A,I,M,N}{E,T}?

다음은 .및 의 문자열에 대한 가능한 모든 해석을 알려주는 JavaScript입니다 -. 최대 길이가 22 인 문자열은 1 초 안에 실행되지만 그보다 높은 것은 매우 느리게 시작됩니다. 예를 들어 HELLO WORLD를 해독하려고하지 않습니다. 브라우저에서 JavaScript 콘솔을 열어서 붙여 넣은 다음 (예 :)을 호출 할 수 있습니다 decode('......-...-..---'). (이 예에서 항목 # 2446은 의도 된 문자열 "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'
};

실제 단어 문자열에만 정리하는 코드는 조금 더 길기 때문에 여기에 넣습니다 . node.js에서 실행되며에 파일이 필요 /usr/share/dict/words-2500합니다. 내가 사용하는 사전은 여기 에서 찾을 수 있습니다 . 순진하지 않습니다-자르기 때문에 더 큰 입력에서 훨씬 빠르게 실행됩니다 .

사전은 내가 어딘가에 인터넷에서 찾은 상위 2,500 개의 단어 목록으로 구성되며, 단어가 아닌 것으로 간주되는 1, 2 및 3 개의 문자 조합을 뺀 것입니다. 이 알고리즘은 짧은 단어를 너무 많이 선택하는 데 민감하며 모든 개별 문자를 단어로 허용하면 크게 느려집니다 (내가보고 있습니다 /usr/share/dict/words).

이 알고리즘은 단어 수를 기준으로 정렬하여 완료되므로 "흥미로운"단어가 맨 위에 오기를 바랍니다. 이것은 HELLO WORLD1 초 안에 실행되고 예상 구문을 첫 번째 적중으로 반환하여 훌륭하게 작동합니다 . 이것으로부터 나는 또한 DATA SCIENTIST(내가 시도한 유일한 다른 문구) 모스 코드는와 동일 하다는 것을 배웠다 NEW REAL INDIA.

편집 : 몇 분 동안 더 흥미로운 것을 검색했습니다. 단어 SPACESSWITCH모사 그램입니다. 지금까지 그들은 내가 찾은 가장 긴 단일 단어 쌍입니다.


3
morsagram 이란 단어를 발명 한 적이 있습니까? 나는 그것을 매우 좋아하지만 웹 검색은 이 사이트에 대한 단일 링크를 제공했습니다 .
BmyGuest

또한이 흥미로운 질문을 Puzzling.SE 에서 공개적인 도전으로 바꾸어 놓았 습니다.
BmyGuest

@BmyGuest 그래, 그것은 완전히 만들어진 단어입니다. 그래도 좀 좋아.
Aaron Dufour

17

문자의 특정 짧은 조합이 모호한 디코딩을 제공한다는 것을 관찰하면 충분합니다. 하나의 모호한 시퀀스로 충분하지만 다음을 볼 수 있습니다.

ATE ~ P
EA ~ IT
MO ~ OM

데이비드 Richerby이 코멘트에 지적 된 바와 같이, 어떤 문자 문자의 임의의 시퀀스를 인코딩하는 방법으로 모스 코드 모호하게 ES 및 TS의 문자열에 해당; 위의 조합은 영어로 된 그럴듯한 문자 조합에서도 마찬가지입니다 (예 : MEAT~ MITT). 아마도 흥미로운 코딩 연습은 다른 것으로 착각 할 수있는 5 개 이하의 문자로 구성된 모든 문자열을 찾아서 동등성 클래스별로 그룹화되어 영어 텍스트 (하나 이상의 단어를 사용하여)에서 실제로 발견 될 수있는 문자 조합으로 제한하는 것입니다.

원래 예를 사용하면 다음과 같은 경우도 발생합니다.

HELLO WORLD ~ HAS TEAM NO MAID TOE

오른쪽은 부분적인 메시지 일지라도 비현실적 일 수 있지만, 그것은 일련의 영어 단어이며 컴퓨터 지원없이 15 분 이내에 발견 될 수 있습니다. 이것은 영어로 된 많은 문구가 영어 단어의 다른 (무의미한) 순서로 잘못 해석 될 수 있다는 증거로 간주 될 수 있습니다.


MT vs TM은 매우 짧은 예입니다.
Raphael

2
@Raphael MT == TM == O 세 개 모두 동일한 시퀀스입니다. 번역하기가 매우 어렵습니다.
Red_Shadow

10

모스 부호는 실제로 이진 부호가 아닌 삼항 부호이므로 공백이 필요합니다. 공백이 없으면 전체 메시지가 아니라 개별 문자로 많은 모호성이 생길 수 있습니다.

예를 들어, 2 개의 점은 I이지만 3 개의 점은 S입니다. 필기하고 두 개의 점이 들리면 즉시 "I"라고 쓰거나 다른 점 (또는 대시)이 들릴 때까지 기다리십니까?

답은 각 값이 공백으로 분리되어 그룹화되어 있다는 것입니다. 연산자가 Morse에서 메시지를 키 지정하면 각 문자 코드 시퀀스 다음에 대시와 동일한 길이의 일시 정지를 작성하여 시퀀스의 끝을 나타냅니다.

한 번에 전체 문장을보고 메시지의 논리적 해석이 무엇인지 파악하기 위해 AI 프로그램을 작성 했음에도 불구하고 여전히 약간의 모호함과 오타가있을 수 있습니다.


2
마지막 문장이 잘린 것 같습니다.
David Richerby

2
@DavidRicherby 예, 공백없이 모스 부호를 사용하여 게시물을 만들려고했기 때문입니다.
Tyler Durden

4

다른 (좋은) 답변에서는 다루지 않지만 일반적으로 사전 지식을 연구하지 않으며 어떤 것도 인용 하지 않습니다 (컴퓨터 과학 의 본질적인 부분 ).

  • CS의이 일반적인 이론은 텍스트 세분화 의 범주 와 "단어 분할"/ "명확성" 범주에 속합니다 . 이론은 약간 다르지만, 기호 시퀀스를 단어 (가변 문자 포함) 등으로 분할하는 방법 등에 대한 이론은 다릅니다. 단위입니다. 여기서 문자열은 글자의 길이가 가변적 인 글자로 나뉘지만 이론은 정확히 1-1은 아니지만 유사합니다. 즉, 문장 내 단어, 가변 단어 문자 길이 및 문장 내 단어, 가변 단어 / 문자 길이 간의 매핑.

  • 다른 사람들이 지적했듯이 이것은 경험적으로 연구 될 수 있습니다. 그리고 누군가는 한 각도에서 (이를 연구하는 여러 가지 방법이 있음) 그것을하고 디렉토리 / 결과 테이블이 큰 웹 페이지 에 결과를 "게시"했습니다 .

    모호한 모스 부호 어 25,787 개를 찾았습니다. 이것은 10,330 개의 별개의 모스 현으로 이루어져 있습니다. 가장 높은 빈도의 모호한 모스 단어에는 13 개의 가능한 기증자 단어가 있습니다. 결과는 동일한 모스 표현을 공유하는 단어의 빈도에 따라 아래 표로 그룹화됩니다.

  • 와우, "문맥 문제"... 3 년 전의 stackoverflow에서 "공백없이 모스 코드 번역" 과 거의 동일한 질문이 현재 0 표입니다.


2

일반적으로 기하 급수적으로 많은 디코딩이 가능하지만 실제로 원하는 경우 모두 나열 할 수 있습니다. 간결한 방식으로 목록을 나열 할 수도 있습니다. 즉, 모든 내용을 간결하게 표현할 수 있습니다. 이것은 프로그래밍 연습에 지나지 않으므로 직접 해보십시오.

즉, 모호성이 있다는 사실은 메시지 또는 메시지의 적어도 일부를 해독하는 능력을 배제하지 않습니다. 모스 부호로 표현 된 텍스트에 대한 확률 론적 모델을 가정하면 (확실성을 ​​위해) 영어로 가정하고 통계적 속성을 사용한다고 가정 할 수 있습니다. 일부 지역 모호성은 피할 수는 있지만 메시지를 본질적으로 해독 할 수 있습니다. 그 이유는 대부분의 디코딩이 의미없는 일반 텍스트에 해당하기 때문입니다. 이를 수행하는 방법은 이전 단락의 동적 프로그래밍 알고리즘을 확장하여 각 디코딩의 가능성을 추정 한 다음 최대 가능성 디코딩을 선택하는 것입니다. 이 방법은 메시지가 길어질수록 성공할 가능성이 높습니다.


하지 않습니다 비터 비 알고리즘은 당신이 설명한 것과 비슷한 일을? 디코딩 수의 기하 급수적 성장을 정량화하는 것은 여기에 적절한 질문입니까, 아니면 cstheory.SE?
john mangual

1
맞습니다. 아이디어는 동적 프로그래밍을 사용하는 것입니다. 지수 성장을 추정하는 것은 아마도 cstheory보다 더 적합 할 것입니다.
Yuval Filmus

실제로 이것은 음성 처리에서 단어를 식별하기 위해 수행되는 것과 매우 유사합니다. 결과는 소위 단어 격자, 즉 분석 된 사운드 순서와 일치 할 수있는 모든 단어 순서를 요약 한 것입니다.
babou

1

가능한 모든 디코딩의 언어를 정의 / 인식 / 생성하는 방법

공백없이 모스 부호는 더 이상 고유하게 해독 할 수 없습니다.

그러나, 그것을 해독하는 모든 가능한 방법을 요약 된 형태로 제공하는 것이 가능하다. 이것은 실제로 음성 처리에서 수행되는 것과 유사합니다. 고유 한 사운드 스트림 (또는 음소)에서 일련의 단어로 분해 될 수있는 모든 방법을 찾아야합니다. 이를 수행하기위한 알고리즘은 단어 격자라고하는 것을 생성합니다. 이 답변 의 "어휘 모호성"섹션에 예제가 있습니다.

이진 모스 부호 (공백 없음)의 경우 점과 대시 만 있지만 문제는 동일합니다.

모든 번역을 얻을 수있는 방법은 다음과 같습니다.

T

wnWn+10nL={w}=L(W)T(L)T(L)

TWTW

세부 사항은 쉽게 해결됩니다. 그러나 더 필요한지 물어보십시오.


0

가능한 모든 해석을 제공하는 솔버의 의사 코드입니다. 이것은 몇 가지 간단한 생각을 기반으로하므로 추가 의견을 환영합니다. 메소드는 지금까지 번역 된 텍스트 중 하나와 모스 부호 중 두 번째 입력을 허용합니다.

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)
        }

}

"단어"사이에 공백없이 가능한 모든 문자와 숫자 조합을 출력합니다. 모호성을 입증하고 싶다면 분명히 그렇게 할 것입니다. 의미있는 메시지를 얻으려면 해시 태그를 읽을 수있는 언어로 번역하는 코드를 찾아보십시오.

위의 내용을 사용하여 위의 작업을 수행하는 C # 프로그램을 작성했습니다. 안녕하세요 세계로 번역 할 수있는 위의 문자열에 대해 2,200 만 개의 가능성으로 실행하는 것을 막았습니다. "Hello"에 해당하는 모스 부호는 20,569 개의 ​​결과를 가져 왔습니다. 나는 또한 숫자를 포함하지 않았다. 허용하면 더 높아질 것입니다.


이러한 알고리즘의 출력은 개별 문자열이 모호하다는 증거이지만 모든 문자열이 모호 하다는 것을 증명하지는 않습니다 .
David Richerby

@DavidRicherby 길이가 1보다 큰 모든 문자열은 모호합니다. 그것은이 페이지의 다른 곳에서 입증되었습니다. 나는 질문의 두 번째 부분에 대답하려고 시도했으며 가능한 모든 솔루션을 문자열에서 추정하는 수단을 제공했습니다.
Red_Shadow

호기심 때문에 C # 프로그램을 공유 하시겠습니까? My Perl 버전 은 "HELLO"에 해당하는 19796 가지 솔루션을 제공합니다. 아마도 아마 일부 경우를 출력하는 것을 잊어 버렸습니다 ...
Squeezy

1
실제 소스 코드는 여기서 다루지 않습니다. 다른 곳에 게시하고 (pastebin, Gist 등) 링크 만하십시오.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.