js расшифровка азбуки Морзе

Для этого проекта я пытаюсь декодировать заданную строку азбуки Морзе. Закодированные символы разделяются одним пробелом, а слова — тремя пробелами. Я с трудом преодолеваю пробелы в словах. Я продолжаю получать "wordundefinedword".

decodeMorse = function(morseCode) {
    outPut = "";

    for (var i = 0; i < morseCode.split(" ").length; i++) {
        if (i === "   ") {
            outPut += " ";
        } else {
            outPut += MORSE_CODE[morseCode.split(" ")[i]];
        }

    }
    return outPut;
}

Пример: "".... . ----" "-- .- -."" -> "ЭЙ, ЧЕЛОВЕК" Извините за странные кавычки. Это не будет показывать пробелы без внешних.


person Allissia Baublet    schedule 01.05.2017    source источник
comment
Покажите образец ввода и ожидаемый результат.   -  person Carcigenicate    schedule 01.05.2017
comment
И i это число. Он никогда не будет равен этой строке.   -  person Carcigenicate    schedule 01.05.2017
comment
morseCode.split(" ") будет мешать любому тройному пробелу в строке. Попробуйте сначала разделить на три пробела.   -  person Joseph Marikle    schedule 01.05.2017


Ответы (9)


Вот метод, который использует .map(), .split() и .join().

function decodeMorse(morseCode) {
  var ref = { 
    '.-':     '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',
  };

  return morseCode
    .split('   ')
    .map(
      a => a
        .split(' ')
        .map(
          b => ref[b]
        ).join('')
    ).join(' ');
}

var decoded = decodeMorse(".-- --- .-. -..   .-- --- .-. -..");
console.log(decoded);

person Joseph Marikle    schedule 01.05.2017
comment
Ваш код был украден :) См. второй снимок экрана по адресу bleepingcomputer.com/news/security/ - person Luc VdV; 08.02.2021
comment
@LucVdV Моя версия даже не настолько хороша, лол! Тем не менее, это интересная статья. Спасибо, что дали мне знать. :) - person Joseph Marikle; 08.02.2021

Возможно, вместо этого есть две вложенные петли. Внешний цикл разбивает азбуку Морзе на три пробела, а внутренний цикл разбивает слово на один пробел. Это проанализирует букву, затем вы сможете сопоставить буквенно-цифровой символ, используя перечисление букв кода Морзе.

// message = Halp! Morse code is driving me nuts!
var message = ".... .- .-.. .--. -·-·--     -- --- .-. ... .     -.-. --- -.. .     .. ...     -.. .-. .. ...- .. -. --.     -- .     -. ..- - ... -·-·--"; 
var alphabet = {  
   "-----":"0",
   ".----":"1",
   "..---":"2",
   "...--":"3",
   "....-":"4",
   ".....":"5",
   "-....":"6",
   "--...":"7",
   "---..":"8",
   "----.":"9",
   ".-":"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",
   "/":" ",
   "-.-.--":"!",
   ".-.-.-":".",
   "--..--":","
};
var messageConverted = [];

message.split("   ").map(function (word) {
    word.split(" ").map(function (letter) {
        messageConverted.push(alphabet[letter]);
    });
    messageConverted.push(" ");
});
 
console.log(messageConverted.join(""));

Или что-то вроде того. Это перечисление не полное (заглавные буквы, знаки препинания), но вы поняли.

person EricL    schedule 01.05.2017
comment
Перечисление символов указано в этом сообщении: stackoverflow. com/questions/26059170/ - person EricL; 01.05.2017
comment
У вас разные точки · для азбуки Морзе !., вероятно, скопированные у кого-то другого, кто считал, что точки на одной высоте - это хорошо. Я хотел таблицу преобразования для какого-то короткого фрагмента, поленился написать ее сам, очевидно, погуглил, попал сюда, скопировал ваш алфавит и только позже понял проблему. - person ASDFGerte; 19.07.2018
comment
Любая существенная причина, по которой .map() используется здесь для двойного цикла вместо .forEach()? - person damon; 13.01.2019
comment
Мне просто нравится пользоваться картами. У каждого свой масштаб, поэтому он кажется мне самым чистым. Но нет. Нет причин, по которым нельзя было бы использовать forEach. - person EricL; 14.01.2019

decodeMorse = function( morseCode ) {
    return morseCode
             .split("   ") // get word code 3 spaces apart
             .map(word => word
                           .split(" ") // get character code 1 spaces apart
                           .map(character => MORSE_CODE[character]) // decode Morse code character
                           .join('')
              )
              .join(' ') // add spaces between words 
              .trim()
}

decodeMorse('.... . -.--   .--- ..- -.. .') // "HEY JUDE"
decodeMorse(' . ') // "E"

Он отлично работает на codewars.com. Если не codewars.com, вам необходимо определить символы Морзе:

    var MORSE_CODE = {  
        "-----":"0",
        ".----":"1",
        "..---":"2",
        "...--":"3",
        "....-":"4",
        ".....":"5",
        "-....":"6",
        "--...":"7",
        "---..":"8",
        "----.":"9",
        ".-":"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",
        "-.-.--":"!",
        ".-.-.-":".",
        "--..--":","
    };

Надеюсь, мой код поможет вам.

person Phương Nguyễn    schedule 01.08.2020

Пример сообщения Морзе:

var message = ".... .- .-.. .--. -.-.--     -- --- .-. ... .     -.-. --- -.. .     .. ...     -.. .-. .. ...- .. -. --.     -- .     -. ..- - ... -.-.--"; 

Словарь Морзе:

var dictionary= {  
   "-----":"0",
   ".----":"1",
   "..---":"2",
   "...--":"3",
   "....-":"4",
   ".....":"5",
   "-....":"6",
   "--...":"7",
   "---..":"8",
   "----.":"9",
   ".-":"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",
   "-.-.--":"!",
   ".-.-.-":".",
   "--..--":","
};

Найдите шаблон, начинающийся с . или -, и переведите его:

var representation = message.replace(/([.-]+[-.]*)/g, (_, x) =>dictionary [x]);
console.log(representation);
person Devmaleeq    schedule 18.08.2019

Другое решение, основанное на 2 циклах. Разделение слов в азбуке Морзе осуществляется с помощью split(" ") - (с 3 знаками разделения) - который разбивает азбуку Морзе на слова, когда он распознает 3 знака разделения. Теперь у вас есть массив x строк. Чтобы получить доступ к каждому элементу (букве) в азбуке Морзе, вы должны сделать еще одно разделение, зациклившись на массиве строк (вы можете использовать «карту»), но теперь с разделением («») - (с 1 разделением знаки). теперь у вас есть массив, содержащий вложенные массивы, каждый из которых представляет слово (конечно, в коде Морзе). Чтобы перебрать словарь азбуки Морзе (объект), вы можете преобразовать его в массив с помощью Object.keys и т. д., а затем найти конкретную букву (в Морзе) в преобразованном массиве (искать конкретный ключ).

пример азбуки Морзе:

 decodeMorse('.... . -.--   .--- ..- -.. .');
 //should return:"HEY JUDE"

функция:

decodeMorse = function(morseCode){ 
  var ind=0;
  var answer = [];
  const TOT_MORSE_CODE = {
  ".-": "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", "|":" "
  };

  const moerse_keys = Object.keys(TOT_MORSE_CODE);/*converting 
  the object into an array*/
  const moerse_values = Object.values(TOT_MORSE_CODE);
  var words_in_morse = morseCode.split ('   ');
  /*sperating the morse code by words*/
  var letters_in_morse = 
       words_in_morse.map(word => word.split(' '));
  /*sperating the morse code by letters for each word*/


  for (i=0 ; i<letters_in_morse.length ; i++) {
    for (j=0 ; j<letters_in_morse[i].length ; j++) {
       if ( moerse_keys.includes(letters_in_morse[i][j]) ) {
         ind = moerse_keys.indexOf( letters_in_morse[i][j] );
         answer.push(moerse_values[ind]);
       }
       if (j===letters_in_morse[i].length-1 ) { /*for seperate 
          words by ' '*/
          answer.push(' ');
       }
    }
  }

  answer.pop(); /*to remove the last ' ' (avoiding getting 
  "HEY JUDE ")*/
  return answer.join('').toUpperCase();
}
person Nathan Barel    schedule 24.05.2020

let STR = "hello".split("");
// % = space
let morse = ".-%-...%-.-.%-..%.%..-%--.%....%..%.---%-.-%.-..%--%-.%---%.--.%--.-%.-.%...%-%..-%...-%.--%-..-%-.--%--..".split("%");
let alphabet = "abcdefghijklmnopqrstuvwxyz".split("")

let output = [];

for(let i = 0; i < STR.length; i++){
    output.push(morse[alphabet.indexOf(STR[i])])
}

console.log(output.join(" "));

Это сделано для одного слова в нижнем регистре, как видите, оно преобразует текст в азбуку Морзе, вместо преобразования морзе в текст

person 5alidshammout    schedule 30.05.2021

Вот метод, который использует .map(), .split(), .join() и .trim(). Он отлично работает для меня на codewars. Таблица азбуки Морзе предварительно загружена для вас как словарь на MORSE_CODE.. поэтому нет необходимости писать весь словарь, как я сделал в этом примере.

function decodeMorse(morseCode) {
  var letter = { 
    '.-':     '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',
  };

  return morseCode
    .split('   ')
    .map(
      a => a
        .split(' ')
        .map(
          b => letters[b]
        ).join('')
    ).join(' ')
    .trim() ;
}
var decoded = decodeMorse("   .-- --- .-. -..   .-- --- .-. -..");
console.log(decoded);

person Edgardo Ruiz    schedule 08.07.2021

Простой пример C# можно найти по адресу https://github.com/zizwiz/Convert-Text-to-Morse-and-Play-it Позволяет преобразовывать текст в азбуку Морзе, а азбуку Морзе преобразовывать в текст, а также воспроизводить азбуку Морзе.

Использует интервалы следующим образом

<summary>
Dot = 1 unit
Dash = 3 units

Between dots and dashes in letter = 1 unit
Between Chars = 3 units
Between words = 7 units
</summary>
person user3884423    schedule 14.07.2021

person    schedule
comment
Можете ли вы добавить какое-то объяснение того, как это отвечает на вопрос? - person Rastalamm; 21.09.2020