Чи код Морзе без пробілів однозначно розшифровується?


54

Чи всі рядки коду Морзе однозначно розшифровуються? Без пробілів,

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

це може бути, Hello Worldале, можливо, перша літера є 5- адже це виглядає дуже малоймовірним, що довільна послідовність крапок і тире повинна мати унікальний переклад.

Можливо, можна використовувати нерівність Крафта, але це стосується лише префіксальних кодів .

Код Морзе з пробілами - це префіксний код, у якому повідомлення завжди можна однозначно декодувати. Щойно ми видалимо пробіли, це вже не відповідає дійсності.


Якщо я маю рацію, і все повідомлення коду Морзе не може бути однозначно розшифровано, чи є спосіб перерахувати всі можливі повідомлення? Ось декілька пов'язаних з нами вправ на codegolf.SE


7
Ви, здається, вже відповіли на власне запитання?
Рафаель

7
"Код Морзе без пробілів" не є кодом Морзе. Пробіли є частиною специфікації, оскільки без них код не розшифровується.
Стівен Кеннеді

1
@StephenKennedy Про це вже в питанні. Ви прочитали його повністю?
Рафаель

3
Сценарій Perl для переліку можливих повідомлень для коду. Не усвідомлював, що це суто теоретична спільнота. :)
Squeezy

1
Ви справді впевнені, що ваша прийнята відповідь взагалі кваліфікується як відповідь або навіть як натяк на що-небудь? Я маю на увазі, що очевидно, що ET = A ... що доводить, що Спілберг мав рацію: ET є прибульцем.
бабу

Відповіді:


91

Нижче наведені обидва правдоподібні повідомлення, але мають зовсім інше значення:

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

6
Мило, але вже встановлено, що Морзе без пробілів неоднозначний, тому я не думаю, що це вартує набагато більше, ніж коментар.
Девід Річербі

37
ОП , здається, просять чи одна серія з крапок і тире без пробілів може бути витлумачено як два «реальних» повідомлень , на відміну від довільних послідовностей Т і Е . Перша SOS! Довідка! складається з двох завушків, а другий - його дата - це граматичне та розумне англійське речення, тому обидва є дійсними повідомленнями. Це відповідає коротко на питання, подаючи приклад.
CJ Dennis

2
@CJDennis Питання зовсім не говорить про це. Він запитує, чи є рядки Морзе однозначно розшифрувані, і чи існує спосіб перерахування всіх рядків, що кодують певну послідовність, якщо крапки та тире. Це взагалі нічого не говорить про те, що рядки повинні мати значення англійською мовою.
Девід Річербі

2
є як конкретний (зустрічний) приклад, так і загальний спосіб вивчення проблеми, і обидва мають відношення до гарної відповіді. див., наприклад, докази / спростування від lakatos
vzn

3
"Що сказано, прапорщику?" I AM HIS DATE"Тож Амелія вирішила втекти зі старим Нунаном , хммм. Нам, мабуть, слід тримати це при собі".
dotancohen

36

Цитуючи Девіда Річербі з коментарів:

Оскільки ⋅ являє собою E і - являє собою T, будь-яке повідомлення Морзе без пробілів можна інтерпретувати як рядок у {Е,Т}

{А,Я,М,N}{Е,Т}?

Ось деякий JavaScript, який розповість про всі можливі інтерпретації рядка .та -. Струни довжиною до 22 запускаються за секунду, але все, що вище, починається досить повільно - я б, наприклад, не намагався розшифрувати НЕЙНИЙ МИР. Ви можете поп відкрити консоль 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працює, пробігаючи за секунду і повертаючи очікувану фразу як перший хіт. З цього я також дізнався, що DATA SCIENTIST(єдину іншу фразу, яку я спробував) морзе кодує так само, як і NEW REAL INDIA.

Редагувати: Я шукав цікавіші кілька хвилин. Слова SPACESі SWITCHє морсаграмами. Поки вони найдовша пара, яку я знайшов.


3
Ви щойно вигадали слово морсаграма ? Мені це дуже подобається, але веб-пошук забезпечив єдине посилання - на цей сайт.
BmyGuest

Я також взяв на себе сміливість перетворити це цікаве питання на відкритий виклик на Puzzling.SE з деяким посиланням на цю публікацію тут.
BmyGuest

@BmyGuest Так, це повністю складене слово. Мені все одно подобається.
Аарон Дюфур

17

Досить зауважити, що певні короткі комбінації літер дають неоднозначні розшифровки. Досить однієї неоднозначної послідовності, але я бачу таке:

ATE ~ P
EA ~ IT
MO ~ OM

та ін. Як зазначає Девід Річербі в коментарях, будь-яка буква еквівалентна рядку Es і Ts, що робить код Морзе неоднозначним як спосіб кодування довільних послідовностей букв; наведені вище комбінації показують, що це справедливо навіть у правдоподібних комбінаціях літер англійською мовою (наприклад, MEAT~ MITT). Можливо, цікавою вправою кодування було б знайти всі рядки з п’яти чи меншої кількості літер, які могли б бути помилково сприйняті чимось іншим, обмежуючи комбінації літер, які насправді можна знайти в англійському тексті (використовуючи одне або більше слів), згруповані за класом еквівалентності.

Використовуючи свій оригінальний приклад, трапляється і так

HELLO WORLD ~ HAS TEAM NO MAID TOE

і хоча права частина, можливо, нереальна навіть як часткове повідомлення, це, безумовно, послідовність англійських слів, і те, яке можна знайти за менше 15 хвилин без допомоги комп’ютера. Це може сприйматись як доказ того, що багато фраз в англійській мові можна порівняти як різну (можливо, безглузду) послідовність англійських слів.


MT vs TM - дуже короткий приклад.
Рафаель

2
@Raphael MT == TM == O Усі три є однаковою послідовністю. Це дуже ускладнює переклад.
Red_Shadow

10

Код Морзе насправді є потрійним кодом, а не двійковим кодом, тому пробіли необхідні. Якби пробілів не було, виникла б велика двозначність, не стільки з усім повідомленням, скільки з окремими листами.

Наприклад, 2 крапки - це я, але 3 крапки - це S. Якщо ви переписуєте та чуєте дві крапки, ви негайно пишете "Я" чи ви чекаєте, поки почуєте ще одну крапку (або тире)?

Відповідь полягає в тому, що кожне значення розділено простір, тому вони згруповані разом. Коли оператори вводять повідомлення в Морзе, вони роблять паузу такої ж довжини, як тире після кожної послідовності літерного коду, щоб вказати кінець послідовності.

Навіть якби ви написали програму AI, щоб одночасно переглянути повне речення та зрозуміти, що було логічним тлумаченням повідомлення, все одно залишиться багато незначних неясностей та неправильних написань, які б


2
Ваше останнє речення, здається, урізане
Девід Річербі

2
@DavidRicherby Так, це тому, що я намагався зробити публікацію за допомогою коду Морзе без пробілів.
Тайлер Дерден

4

кілька записок, які не висвітлені в інших (хороших) відповідях, але які, як правило, не вивчають попередніх знань і цитують будь-які речі (для мене невід'ємна частина інформатики ).

  • ця загальна теорія CS потрапляє в категорію сегментації тексту, а також "розщеплення слів" / "розбіжність", хоча там теорія дещо інша, її розділення послідовностей символів на слова (зі змінними літерами) тощо, де символи є одиницями. тут рядки розбиваються на літери, де букви мають змінну довжину, але теорія є аналогічною, хоча не точно 1-1. тобто відображення між реченнями-словами, змінними-словами-буквами-довжинами та реченнями-словами, змінними-словами / буквами-довжинами.

  • як зазначають інші, це можна вивчити емпірично. і хтось зробив це з одного кута (є кілька способів цього вивчити) і "опублікував" результати на веб-сторінці з великим каталогом / таблицею результатів.

    Я знайшов 25 877 неоднозначних кодових слів Морзе. Це зроблено з 10303 різних морзових струн. Багатозначне неоднозначне слово Морзе має 13 можливих слів-донорів. Результати згруповані нижче в таблицях на основі частоти слів, які мають одне й те саме представлення Морзе.

  • уау, "контекст має значення" ... майже однакове запитання "переклад коду Морзе без пробілів" на stackoverflow від 3 років тому наразі має 0 голосів.


2

Загалом можливе розшифрування експоненціально, але якщо ви дійсно хочете, ви можете перерахувати їх усі. Ви також можете їх перелічити стислим способом, тобто дати коротке уявлення для всіх. Оскільки це не що інше, як вправа програмування, я закликаю вас робити це самостійно.

Однак, факт неоднозначності не виключає можливості розшифровки повідомлення або, принаймні, великих частин повідомлення. Якщо припустити ймовірнісну модель тексту, представленого кодом Морзе, - для певності можна припустити, що це англійська мова та використовувати статистичні властивості англійської мови - можливо, можливо, істотно розшифрувати повідомлення, хоча деякі місцеві неоднозначності можуть бути неминучими. Причина полягає в тому, що більшість декодувань відповідають безглуздому простому тексту. Спосіб зробити це - розширити алгоритм динамічного програмування з попереднього абзацу, щоб оцінити ймовірність кожного декодування, а потім вибрати максимальну ймовірність декодування. Цей підхід має більше шансів на успіх, оскільки повідомлення стає довшим.


Хіба алгоритм Вітербі не робить щось подібне до того, що ви описали? Кількісне визначення експоненціального приросту кількості декодування - це відповідне питання тут чи cstheory.SE?
Джон Мангуал

1
Правильно, ідея полягає у використанні динамічного програмування. Оцінка експоненціального зростання, ймовірно, підходить тут краще, ніж цетеорія.
Yuval Filmus

насправді це дуже схоже на те, що робиться для виявлення слів при обробці мовлення. Результатом є те, що називається решіткою слова, тобто зведене представлення всіх послідовностей слів, які могли б відповідати проаналізованій звуковій послідовності.
бабу

1

Як визначити / розпізнати / генерувати мову всіх можливих декодування.

Ясна річ, що без пробілів код Морзе вже не є однозначно розшифруваним.

Однак можна в стислому вигляді дати всі можливі способи його декодування. Це насправді схоже на те, що робиться при обробці мовлення: з унікального потоку звуків (або з телефонів) ви повинні знайти всі способи його розкладання в послідовності слів. Алгоритми для цього виробляють те, що називається словом решітки. Ви знайдете приклад у розділі "лексична неоднозначність" цієї відповіді .

Що стосується двійкового коду Морзе (без пробілів), у вас є лише крапки та тире, але проблема та сама.

Спосіб отримання всіх перекладів полягає в наступному.

Т

шнWн+10нL={ш}=L(W)Т(L)Т(L)

ТWТW

Деталі легко опрацьовуються. Але запитайте, чи потрібно вам більше.


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 #, яка робить вище. Я не дозволяв йому працювати з 22 мільйонами можливостей для вищезгаданого рядка, який може перетворитись на привіт світ. Еквівалент коду Морзе «Привіт» призвів до 20 569 можливих результатів. Я також не включав цифри. Це було б вище, якби я дозволив їм.


Вихід такого алгоритму був би доказом того, що будь-який окремий рядок є неоднозначним, але це не доведе, що всі рядки неоднозначні.
Девід Річербі

@DavidRicherby Усі рядки довжиною> 1 неоднозначні. Це було доведено в інших місцях на цій сторінці. Я намагався відповісти на другу частину питання і запропонувати спосіб екстраполювати всі можливі рішення з рядка.
Red_Shadow

Ви просто з цікавості поділилися б своєю програмою C #? Моя версія Perl пропонує 19796 можливі рішення для еквівалента "HELLO". Швидше за все, я забув видати деякі справи, хоча ...
Squeezy

1
Реальний вихідний код тут офтопік; будь ласка, опублікуйте його в іншому місці (pastebin, Gist, ...) і лише посилання на нього
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.