スペースのないモールス信号は一意に解読可能ですか?


54

すべてのモールス符号文字列は一意に解読可能ですか?スペースなしで、

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

可能性はありますHello Worldが、おそらく最初の文字はaです5-実際には、ドットとダッシュの任意のシーケンスが一意の翻訳を持つべきではないようです。

人は多分Kraft不等式を使用するかもしれませんが、それはプレフィックスコードにのみ適用されます

モールス信号スペースではある接頭コードメッセージは常に一意に復号することができます。スペースを削除すると、これは事実ではなくなります。


私が正しい場合、すべてのモールス信号メッセージを一意にデコードすることはできませんが、考えられるすべてのメッセージをリストする方法はありますか?codegolf.SEで見つけたいくつかの関連する演習を次に示します。


7
あなたはすでにあなた自身の質問に答えているようです?
ラファエル

7
「スペースのないモールス符号」はモールス符号ではありません。スペースがないとコードが解読できないため、スペースは仕様の一部です。
スティーブンケネディ14

1
@StephenKennedyそれはすでに問題になっています。完全に読みましたか?
ラファエル

3
コードの考えられるメッセージをリストするPerlスクリプト。これが純粋に理論的なコミュニティであることに気づかなかった。:)
スクイージー14

1
受け入れられた回答は、まったくの回答として、または何かへのヒントとしても資格があると本当に確信していますか?ET = Aであることは明らかです...これは、スピルバーグが正しかったことを証明しています。ETはエイリアンです。
babou 14

回答:


91

以下は両方とももっともらしいメッセージですが、意味はまったく異なります。

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

6
かわいいですが、スペースのないモールスは曖昧であることがすでに確立されているので、これはコメント以上の価値はないと思います。
デビッドリチャービー14

37
OPは、スペースのない一連のドットとダッシュを、TEの任意のシーケンスではなく、2つの「実際の」メッセージとして解釈できるかどうかを尋ねているようです。最初のSOS!助けて!2つの間投詞で構成されており、2番目の日付は文法的で賢明な英語の文なので、両方とも有効なメッセージです。これは例を提供することで質問に簡潔に答えます。
CJデニス14

2
@CJDennis質問はそれをまったく言っていません。モールス文字列が一意に解読可能かどうか、およびドットとダッシュの場合に特定のシーケンスにコードするすべての文字列をリストする方法があるかどうかを尋ねます。文字列が英語で意味を持たなければならないことについては何も述べていません。
デビッドリチャービー14

2
そこに両方ある特定の(カウンタ)の例と一般的な問題を研究する方法は、との両方が良い答え(複数可)に関連しています。例:lakatosによる証明/反論
vzn 14

3
「それは何と言っていますか?」I AM HIS DATE「だから、アメリアは古いヌーナンと駆け引きすることにした。うーん。これを自分で守るべきだろう。」
dotancohen

36

コメントからDavid Richerbyを引用:

⋅はEを表し、−はTを表すため、スペースのないモールス信号は{ E T } ∗の文字列として解釈できます{ET}

さらに、A、I、M、およびNは2つのモールス文字(それぞれfour-、combinations、-、-⋅)の4つの可能な組み合わせで表されるため、スペースのないメッセージも文字列として解釈できます。 。長さが1を超えるモールス信号の場合、これはDavidの解釈とは異なることに注意してください。したがって、一意の解釈を持つ唯一のメッセージは、長さ1(およびメッセージとしてカウントする場合は0)のメッセージ、つまりEを表す⋅、およびTを表す-のみです。{AMN}{ET}

ここではいくつかの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です。私が使っている辞書はこちらにあります。それは素朴ではありません-それは行くにつれて剪定するので、より大きな入力ではるかに速く実行されます。

辞書は、インターネットで見つけたトップ2500の単語リストから構成されており、単語ではないとみなした1文字、2文字、3文字の組み合わせがありません。このアルゴリズムは、選択できない短い単語が多いことに敏感であり、たとえば個々の文字をすべて単語として許可すると大幅に遅くなります(私はあなたを見ています/usr/share/dict/words)。

アルゴリズムは単語数に基づいてソートすることで終了するため、「興味深い」単語が最上位に表示されることを期待します。これは非常にうまく機能しHELLO WORLD、1秒未満で実行され、予想されるフレーズを最初のヒットとして返します。このことから、私はDATA SCIENTIST(私が試した唯一のフレーズ)モールス符号がと同じであることも学びましたNEW REAL INDIA

編集:数分間、もっと面白いものを検索しました。言葉SPACESSWITCHは、モルサグラムです。これまでのところ、それらは私が見つけた最長の単一単語のペアです。


3
モルサグラムという言葉を発明したばかりですか?私はとても気に入っていますが、ウェブ検索はこのサイトへの単一のリンクを提供しました。
BmyGuest 14

また、この興味深い質問をPuzzling.SEのオープンなチャレンジに変えるために、この投稿を参照して自由に考えました。
BmyGuest 14

@BmyGuestうん、それは完全に作り上げられた言葉です。しかし、私はそれが好きです。
アーロンデュフォー14

17

文字の特定の短い組み合わせがあいまいなデコードを与えることを観察するのに十分です。1つのあいまいなシーケンスで十分ですが、次のように表示されます。

ATE ~ P
EA ~ IT
MO ~ OM

等。コメントの中でDavid Richerbyが指摘しているように、どの文字もEsとTsの文字列に相当します。上記の組み合わせは、英語のもっともらしい文字の組み合わせ(たとえば、MEATMITT)でもこれが当てはまることを示しています。おそらく、興味深いコーディングの練習は、他の何かと間違われる可能性のある5文字以下のすべての文字列を見つけることです。実際には、英語のテキスト(1つ以上の単語を使用)で等価クラスによってグループ化された文字の組み合わせに制限されます。

元の例を使用すると、たまたま

HELLO WORLD ~ HAS TEAM NO MAID TOE

右側はおそらく部分的なメッセージとしても非現実的ですが、確かに一連の英語の単語であり、コンピューターの支援なしで15分以内に見つけることができます。これは、英語の多くのフレーズが英語の単語の別の(おそらく無意味な)シーケンスとして誤って解析される可能性があることの証拠と考えることができます。


MT vs TMは非常に短い例です。
ラファエル

2
@Raphael MT == TM == O 3つはすべて同じシーケンスです。そのため、翻訳が非常に困難になります。
Red_Shadow 14

10

モールス符号は実際にはバイナリコードではなく3進コードであるため、スペースが必要です。スペースがなければ、メッセージ全体ではなく、個々の文字に多くのあいまいさが生じます。

たとえば、2つのドットはIですが、3つのドットはSです。文字起こし中に2つのドットが聞こえた場合、すぐに「I」と書きますか、それとも別のドット(またはダッシュ)が聞こえるまで待ちますか?

答えは、各値がスペースで区切られているため、グループ化されるということです。オペレーターがモールス語でメッセージにキーを入力すると、各文字コードシーケンスの後にダッシュと同じ長さのポーズを入れて、シーケンスの終わりを示します。

一度に完全な文を見て、メッセージの論理的な解釈が何であるかを把握するAIプログラムを作成したとしても、まだ多くのわずかなあいまいさとミススペルがあります。


2
最後の文は切り捨てられたようです。
デビッドリチャービー14

2
@DavidRicherbyはい、それはスペースなしでモールス信号を使用して投稿しようとしたためです。
タイラーダーデン14

4

他の(良い)回答ではカバーされていないが、一般に事前知識を調査したり、何かを引用したりしないノート(私にとってはコンピューターサイエンスの本質的な部分)。

  • このCSの一般的な理論は、テキストセグメンテーションと「単語分割」/「曖昧性除去」のカテゴリに分類されますが、理論は少し異なります。単位です。ここで、文字列は文字に可変長の文字に分割されますが、理論は類似していますが、正確には1-1ではありません。つまり、文への文、可変語の文字長、および文への文、可変語/文字長の間のマッピング。

  • 他の人が指摘したように、これは経験的に研究することができます。誰かが1つの角度からそれを行い(これを研究する方法は複数あります)、結果を大きなディレクトリ/結果の表を含むWebページに「公開」しました。

    25,787個の曖昧なモールス符号語を見つけました。これは、10,330個の異なるモールス文字列で構成されています。最も頻度の高い曖昧なモールス語には、13の可能なドナー語があります。結果は、同じモールス信号表現を共有する単語の頻度に基づいて、以下の表にグループ化されています。

  • うわー、「コンテキストが重要」... 3年前のstackoverflowでの「スペースのないモールス信号の翻訳」とほぼ同じ質問には、現在0票があります。


2

一般に、指数関数的に多くの可能なデコードがありますが、本当に必要な場合は、それらをすべてリストできます。それらを簡潔な方法でリストすることもできます。つまり、それらすべてを簡潔に表現することができます。これはプログラミングの練習にすぎないので、自分でやるように挑戦します。

そうは言っても、あいまいさが存在するという事実は、メッセージ、またはメッセージの少なくとも大部分を解読する能力を妨げるものではありません。モールス符号で表されるテキストの確率モデルを仮定すると(明確にするために、英語であると仮定し、英語の統計的特性を使用します)、メッセージを本質的にデコードできる場合がありますが、一部のローカルなあいまいさは避けられません。その理由は、ほとんどのデコードが意味のない平文に対応しているためです。その方法は、前の段落の動的計画法アルゴリズムを拡張して各デコードの尤度を推定し、最尤デコードを選択することです。このアプローチは、メッセージが長くなるにつれて成功する可能性が高くなります。


ビタビアルゴリズムは、あなたが説明したものと似たようなことをしないのですか デコード数の指数関数的増加を定量化することは、ここで適切な質問ですか、それともcstheory.SEですか?
ジョンマングアル14

1
そう、アイデアは動的プログラミングを使用することです。指数関数的成長を推定することは、おそらくcstheoryよりもここに適合するでしょう。
ユヴァルフィルマス14

実際には、これは音声処理で単語を識別するために行われることと非常に似ています。その結果、単語ラティスと呼ばれるものが得られます。これは、分析された音声シーケンスに一致する可能性のあるすべての単語シーケンスの要約表現です。
babou 14

1

すべての可能なデコードの言語を定義/認識/生成する方法。

明らかに、スペースなしでは、モールス信号はもはや一意に解読できません。

しかし、それをデコードするためのすべての可能な方法を凝縮した形で与えることは可能です。これは実際に音声処理で行われていることと似ています。音(または音素)の一意のストリームから、一連の単語に分解できるすべての方法を見つける必要があります。これを行うためのアルゴリズムは、ワードラティスと呼ばれるものを生成します。この回答の「語彙のあいまいさ」セクションに例を示します

バイナリモールス符号(スペースなし)の場合、ドットとダッシュしかありませんが、問題は同じです。

すべての翻訳を取得する方法は次のとおりです。

T

wnWn+10nL={w}=LWTLTL

TWTW

詳細は簡単に解決できます。しかし、もっと必要かどうか尋ねてください。


0

可能なすべての解釈を提供するソルバーの疑似コード。これはいくつかの簡単な考えに基づいているため、追加の入力を歓迎します。メソッドは、これまで翻訳されたテキストの1つとモールス信号の2つ目の2つの入力を受け入れます。

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の結果が得られました。数字も含めませんでした。それらを許可した場合、それは高くなります。


このようなアルゴリズムの出力は、個々の文字列があいまいであることの証明になりますが、すべての文字列があいまいであることを証明しません。
デビッドリチャービー14

@DavidRicherby長さが1より大きいすべての文字列はあいまいです。それはこのページの他の場所で証明されています。私は質問の2番目の部分に答えようとしており、文字列からすべての可能な解を推定する手段を提供していました。
Red_Shadow 14

好奇心から、C#プログラムを共有しますか?私のPerlバージョンには、「HELLO」に相当する19796の可能なソリューションがあります。おそらく私は...かかわらず、出力にいくつかのケースを忘れてしまった
Squeezy

1
実際のソースコードはここではオフトピックです。他の場所(pastebin、Gistなど)に公開し、リンクのみにしてください。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.