Boşluksuz Mors kodu benzersiz bir şekilde deşifre edilebilir mi?


54

Tüm Mors kodu dizeleri benzersiz bir şekilde deşifre edilebilir mi? Boşluklar olmadan,

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

olabilir Hello Worldama belki de ilk harf bir 5- aslında pek olası görünmeyen bir nokta ve çizgi dizisinin benzersiz bir çevirisi olmalıdır.

Biri muhtemelen Kraft eşitsizliğini kullanabilir ancak bu sadece önek kodları için geçerlidir .

Morse kodu boşluklu olan başlangıç kodunu iletileri her zaman benzersiz deşifre edilebileceği. Bir kez boşlukları kaldırdığımızda, bu artık doğru değil.


Haklıysam ve tüm Mors kodu mesajlarının benzersiz bir şekilde kodu çözülemiyorsa, olası tüm mesajları listelemenin bir yolu var mı? İşte codegolf.SE üzerinde bulunan bazı ilgili egzersiz


7
Zaten kendi sorunuzu cevaplamış gibisiniz?
Raphael

7
"Boşluksuz mors kodu" mors kodu değil. Boşluklar şartnamenin bir parçasıdır çünkü onlarsız kod deşifre edilemez.
Stephen Kennedy

1
@StephenKennedy Bu zaten bir soru. Tamamen okudun mu?
Raphael

3
Bir kod için olası mesajları listelemek için Perl betiği . Bunun tamamen teorik bir topluluk olduğunun farkında değildim. :)
Squeezy

1
Kabul ettiğiniz cevabın gerçekten bir cevap, hatta herhangi bir şeyin ipucu olarak nitelendirildiğinden emin misiniz? Yani Spielberg'in haklı olduğunu kanıtlayan ET = A ... açıktır: ET bir Uzaylı.
babu

Yanıtlar:


91

Aşağıdakilerin ikisi de makul mesajlardır, ancak tamamen farklı bir anlama sahiptir:

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

6
Sevimli ama zaten boşluksuz Mors'un belirsiz olduğu, bu yüzden bunun bir yorumdan daha değerli olduğunu düşünmüyorum.
David Richerby

37
OP, boşluksuz bir nokta ve çizgi serisinin, T ve E'nin rastgele dizilerine karşılık gelen iki "gerçek" mesaj olarak yorumlanıp yorumlanamayacağını soruyor gibi görünüyor . İlk sos! Yardım! iki sorgulamadan oluşuyor ve ikincisiyim tarihi dilbilgisel ve mantıklı bir İngilizce cümledir, bu yüzden ikisi de geçerli mesajlardır. Bu soruya bir örnek vererek kısa sürede soruyu yanıtlar.
CJ Dennis,

2
@CJDennis Soru hiç söylemedi. Mors karakter dizilerinin benzersiz bir şekilde deşifre edilip edilemeyeceğini ve noktalar ve kısa çizgiler varsa verilen bir diziye kodlayan tüm karakter dizilerini listelemenin bir yolu olup olmadığını sorar. İngilizce'de anlamı olan iplerle ilgili hiçbir şey söylemez.
David Richerby

2
Hem spesifik (sayaç) bir örnek hem de sorunu incelemenin genel bir yolu vardır ve her ikisi de iyi cevap (lar) ile ilgilidir. bkz. örneğin , lakatos tarafından yapılan ispatlar / reddedilmeler
vzn

3
"Ne diyor, komiser?" I AM HIS DATE"Böylece Amelia eski Noonan'la kaçmaya karar verdi . Hmmm. Muhtemelen bunu kendimize saklamalıyız."
dotancohen

36

David Richerby'yi yorumlardan alıntı:

⋅ E'yi ve - T'yi temsil ettiğinden, boşluksuz herhangi bir Mors mesajı içinde bir dize olarak yorumlanabilir.{E,T}

Ayrıca, A, I, M ve N iki mors karakterinin (sırasıyla sırasıyla by-, ⋅⋅, -, -⋅) dört olası birleşimi ile temsil edildiğinden, boşluksuz herhangi bir mesaj bir dize olarak da yorumlanabilir. . 1'den büyük olan herhangi bir Mors mesajı için bunun David'in yorumundan farklı olduğuna dikkat edin. Bu nedenle, benzersiz yorumlara sahip olan tek mesajlar, uzunluk 1'dir (ve sanırım, eğer bir mesaj olarak sayılırsa, 0) - bu, E E'yi temsil eder ve -, T'yi temsil eder.{A,I,M,N}{E,T}?

İşte size bir dize .ve tüm olası yorumlarını anlatan bazı JavaScript -. 22'ye kadar uzunluktaki diziler bir saniyenin altında koşuyor, ancak bundan daha yüksek bir şey oldukça yavaşlamaya başlıyor - örneğin, HELLO WORLD'ü onunla çözmeyi denemem. Tarayıcınızda bir JavaScript konsolu açabilir, bunu yapıştırabilir ve sonra örneğin arayabilirsiniz decode('......-...-..---'). (Bu örnekte, 2446 numaralı giriş, "HELLO" hedeflenen dizedir.)

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'
};

Sadece gerçek kelimelerin dizelerine budamak için kod biraz daha uzun, ben de buraya koydum . Node.js altında çalışır ve adresinde bir dosya bekler /usr/share/dict/words-2500. Kullandığım sözlük burada bulunabilir . Saf değildir - ilerledikçe kuru erik, böylece daha büyük girdilerde çok daha hızlı çalışır .

Sözlük, internette bir yerde bulduğum en iyi 2500 kelime listesinden, eksi bazı 1-, 2- ve 3- kelime olmadığını düşündüğüm harf kombinasyonlarından oluşuyor. Bu algoritma, aralarından seçim yapabileceğiniz çok kısa kelime olmasına karşı hassastır ve eğer her mektuba bir kelime olarak izin verirseniz (size bakıyorum), sert bir şekilde yavaşlar /usr/share/dict/words.

Algoritma, kelime sayısına göre sıralama yaparak sona erer, böylece "ilginç" olanlar umarım en üstte olurlar. Bu harika HELLO WORLDçalışıyor, bir saniyenin altında çalışıyor ve beklenen ifadeyi ilk vuruş olarak döndürüyor. Bundan da öğrendim DATA SCIENTIST(denedim sadece diğer ifade) aynı Mors kodları NEW REAL INDIA.

Düzenleme: Birkaç dakika daha ilginç olanları aradım. Kelimeler SPACESve SWITCHmorsagramlar. Şimdiye kadar bulduğum en uzun tek kelime çifti.


3
Morsagram kelimesini daha yeni icat ettiniz mi? Çok beğendim, fakat bir web araması bu siteye tek bir bağlantı sağladı .
BmyGuest

Ben de bu ilginç soruyu Puzzling.SE'de açık bir soruna dönüştürebilme özgürlüğüne kavuştum .
BmyGuest

@BmyGuest Evet, bu tamamen tamamlanmış bir kelime. Yine de hoşuma gitti.
Aaron Dufour

17

Bazı kısa harf kombinasyonlarının belirsiz kodlar çıkardığını gözlemlemek yeterlidir. Tek bir belirsiz dizi yeterlidir, ancak aşağıdakileri görebiliyorum:

ATE ~ P
EA ~ IT
MO ~ OM

vb David Richerby yorumlarda belirttiği gibi, herhangi bir harf harf keyfi dizilerini kodlayan bir yolu olarak Mors Kodu belirsiz hale getirir Es ve Ts oluşan bir dizeye eşdeğerdir; Yukarıdaki kombinasyonlar bunun İngilizce'deki olası harf kombinasyonları için bile geçerli olduğunu göstermektedir (örneğin, MEAT~ MITT). Belki de ilginç bir kodlama çalışması, başka bir şeyle yanlış olabilecek beş veya daha az harften oluşan tüm karakter dizilerini bulmak, eşdeğerlik sınıfına göre gruplandırılmış İngilizce metinde (bir veya daha fazla kelime kullanarak) bulunabilecek harf kombinasyonlarını kısıtlamak olabilir.

Orijinal örneğinizi kullanarak, aynı şekilde olur

HELLO WORLD ~ HAS TEAM NO MAID TOE

ve sağ taraf, kısmi bir mesaj olarak bile gerçekçi olmayabilirken, kesinlikle bir İngilizce kelime dizisidir ve 15 dakikadan daha az bir sürede bilgisayar yardımı olmadan bulunabilecek bir kelimedir. Bu, İngilizce'deki birçok ifadenin İngilizce kelimelerin farklı (muhtemelen saçma bir) dizisi olarak yanlış değerlendirilebileceğinin kanıtı olarak alınabilir.


MT vs TM çok kısa bir örnektir.
Raphael

2
@Raphael MT == TM == O Üçü de aynı sekanstır. Bu çevirmeyi çok zorlaştırıyor.
Red_Shadow

10

Mors Kodu aslında bir üçlü koddur, ikili kod değildir, bu nedenle boşluklar gereklidir. Boşluklar olmasaydı, tüm mesajda değil, bireysel mektuplarda çok fazla belirsizlik ortaya çıkardı.

Örneğin, 2 nokta bir I'dir, ancak 3 nokta S'dir. Yazıyor ve iki nokta duyuyorsanız, hemen "I" yazıyor musunuz yoksa başka bir nokta (veya çizgi) duyana kadar bekler misiniz?

Cevap, her bir değerin boşlukla ayrılmış olması, böylece birlikte gruplandırılmasıdır. Operatörler Mors'taki mesajları kilitlediklerinde, dizinin sonunu belirtmek için her harf kodu dizisinden sonraki kısa bir çizgi ile aynı uzunlukta bir duraklama yaparlar.

Bir seferde tam cümleye bakmak ve mesajın mantıklı yorumlanmasının ne olduğunu bulmak için bir AI programı yazsanız bile, yine de çok az belirsizlikler ve yanlış yazımlar olacaktır.


2
Son cümleniz kesildi.
David Richerby

2
@DavidRicherby Evet, çünkü Mors Kodunu boşluksuz kullanarak posta göndermeye çalıştım.
Tyler Durden

4

diğer (iyi) cevaplarda ele alınmayan ancak genel olarak önceki bilgileri araştırmayan ve herhangi bir şeyden bahseden birkaç not (bana bilgisayar biliminin içsel bir parçası ).

  • CS'nin bu genel teorisi, metin bölümleme kategorisine ve aynı zamanda “kelime bölme” / “belirsizleştirme” kategorisine girer, ancak teori biraz farklı olmasına rağmen, sembollerin dizilerini kelimelere (değişken harflerle) ayırma, vb. birimlerdir. Burada, dizeler harflerin değişken uzunluklara sahip olduğu harflere bölünmüştür, ancak teori tam olarak 1-1 olmasa da benzerdir. yani cümle-kelime, değişken-kelime-harf uzunlukları ve cümle-sözcükler, değişken-kelime / harf uzunlukları arasında eşleştirme.

  • Diğerlerinin de belirttiği gibi, deneysel olarak incelenebilir. ve birisi bunu bir açıdan yaptı (bunu incelemenin birden fazla yolu var) ve sonuçları büyük bir dizin / sonuç tablosu içeren bir web sayfasında "yayınladı" .

    25.787 belirsiz Mors kodu kelime buldum. Bu, 10,330 ayrı Mors dizgisinden yapılır. Belirsiz olan en yüksek Mors kelimesi, 13 olası donör kelimeye sahiptir. Sonuçlar, aynı Mors temsilini paylaşan kelimelerin sıklığına göre tablolar halinde gruplandırılmıştır.

  • vay, "bağlam önemlidir" ... 3 yıl önceki stackoverflow'ta "mors kodunu boşluk bırakmadan çevirme" neredeyse aynı soru şu anda 0 oy aldı.


2

Genel olarak katlanarak birçok olası kod çözme işlemi vardır, ancak gerçekten isterseniz, hepsini listeleyebilirsiniz. Bunları ayrıca özlü bir şekilde listeleyebilirsiniz, yani hepsi için özlü bir temsilde bulunabilirsiniz. Bu bir programlama alıştırmasından başka bir şey olmadığı için, kendin yapman için sana meydan okuyorum.

Bununla birlikte, belirsizlik olduğu gerçeği, mesajı ya da en azından mesajın büyük bölümlerini deşifre etme kabiliyetini engellemez. Mors kodu ile temsil edilen metin için olasılıksal bir model varsayarsak - kesin olarak, ingilizce olduğunu ve ingilizcenin istatistiksel özelliklerini kullandığını varsayabiliriz - bazı yerel belirsizlikler kaçınılmaz olsa da, mesajın kodunu çözmek mümkün olabilir. Bunun nedeni, kod çözmelerin çoğunun anlamsız düz metinlere karşılık gelmesidir. Bunu yapmanın yolu, her bir kod çözmenin olasılığını tahmin etmek için önceki paragraftan dinamik programlama algoritmasını genişletmek ve sonra da maksimum kod çözme olasılığını seçmektir. Bu yaklaşım mesaj uzadıkça başarılı olma şansı daha fazladır.


Does not Viterbi algoritması size tarif ne benzer bir şey yapmak? Kod çözme sayısının üssel büyümesinin niceliği, burası için uygun bir soru mu, yoksa cstheory.SE?
john mangual

1
Bu doğru, fikir dinamik programlama kullanmaktır. Üstel büyümeyi tahmin etmek muhtemelen cstheory'den daha iyi uyuyor.
Yuval Filmus

Aslında, bu konuşma işlemede kelimeleri tanımlamak için yapılanlara çok benzer. Sonuç, kafes kelimesi olarak adlandırılan, analiz edilen ses dizisiyle eşleşebilecek tüm kelime dizilerinin yoğunlaştırılmış bir gösterimidir.
babu

1

Tüm olası kod çözme dilleri nasıl tanımlanır / tanınır / üretilir?

Açıkça, boşluk olmadan, mors kodu artık benzersiz bir şekilde deşifre edilemez.

Bununla birlikte, onu çözmek için mümkün olan bütün yolları yoğunlaştırılmış bir şekilde vermek mümkündür. Bu aslında konuşma işleminde yapılanlara benzer: benzersiz bir ses akışından (veya fonemlerden), bir kelime dizisinde ayrıştırılabilecek tüm yolları bulmanız gerekir. Bunu yapmak için kullanılan algoritmalar, kafes kelimesi olarak adlandırılan şeyi üretir. Bu cevabın "sözcük belirsizliği" bölümünde bir örnek bulacaksınız .

İkili Mors kodu söz konusu olduğunda (boşluksuz) yalnızca noktalarınız ve çizgileriniz vardır, ancak sorun aynıdır.

Tüm çevirileri elde etme şekliniz aşağıdaki gibidir.

T

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

TWTW

Detaylar kolayca çözüldü. Fakat daha fazlasına ihtiyacınız olup olmadığını sorun.


0

Tüm olası yorumları verecek bir çözücü için bazı sahte kodlar. Bu birkaç hızlı düşünceye dayanmaktadır, bu yüzden ek girdi memnuniyetle karşılanacaktır. Yöntem, şu ana kadar çevrilmiş olan metinlerden biri ve mors kodunun ikinci girişini kabul eder.

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

}

Bu, "kelimeler" arasında boşluk bırakmadan, tüm harf ve rakam kombinasyonlarını çıkartacaktır. Eğer belirsizliği ispatlamak isteseydin, kesinlikle bunu yapardı. Anlamlı mesajlar almak istiyorsanız, hashtag'leri okunabilir dile çevirmek için gereken kodu aramayı deneyin.

Yukarıdakileri kullanarak, yukarıdakileri yapan C # dilinde bir program yazdım. Merhaba dünyaya tercüme edebilecek yukarıdaki dize için 22 milyon ihtimalde çalışmasını durdurdum. "Merhaba" eşdeğer Mors Kodu 20.569 olası sonuç ile sonuçlandı. Ben de sayıları dahil etmedim. Onlara izin verseydim bu daha yüksek olurdu.


Böyle bir algoritmanın çıktısı, herhangi bir dizginin belirsiz olduğuna dair bir kanıt olacaktır, ancak tüm dizgilerin belirsiz olduğunu kanıtlamaz .
David Richerby

@DavidRicherby> 1 uzunluğundaki tüm dizeler belirsiz. Bu, bu sayfada başka bir yerde kanıtlanmıştır. Sorunun ikinci kısmına cevap vermeye çalışıyordum ve olası tüm çözümleri bir dizgeden daha fazla tahmin etmek için bir araç sağladım.
Red_Shadow

Sadece meraktan, C # programınızı paylaşır mısın? Perl versiyonum "HELLO" eşdeğeri için 19796 olası çözümle geliyor. Büyük ihtimalle bazı durumlarda çıktı vermeyi unuttum ...
Squeezy

1
Gerçek kaynak kodu burada açıktır; lütfen başka bir yerde yayınlayın (pastebin, Gist, ...) ve yalnızca bağlantı verin.
Raphael
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.