【问题标题】:js decoding morse codejs解码莫尔斯电码
【发布时间】:2021-11-24 09:23:15
【问题描述】:

对于这个项目,我正在尝试解码给定的摩尔斯电码字符串。编码字符由一个空格分隔,单词由三个空格分隔。我很难通过单词空间。我不断收到“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;
}

示例:“”.... -.--" "-- .- -."" -> "嘿,伙计" 对不起,奇怪的报价。它不会显示没有外部空间的空间。

【问题讨论】:

  • 显示示例输入和预期输出。
  • i 是一个数字。它永远不会等于那个字符串。
  • morseCode.split(" ") 将消除字符串中的任何三重空格。尝试先拆分三个空格。

标签: javascript morse-code


【解决方案1】:

也许有两个嵌套的循环。外部循环将您的摩尔斯电码分成三个空格,内部循环将单词分成一个空格。这将解析出字母,然后您可以使用摩尔斯电码字母的枚举来映射字母数字字符。

// 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(""));

或者类似的东西。该枚举不完整(大写字母、标点符号),但您明白了。

【讨论】:

  • 这篇文章中列出了字符的枚举:stackoverflow.com/questions/26059170/…
  • 对于莫尔斯电码“!.”,你有不同的点“·”,很可能是从其他人那里复制过来的,他们认为点在同一高度是一件好事。我想要一个简短的 sn-p 的转换表,显然自己懒得写一个,谷歌搜索,到这里,复制你的字母表,后来才意识到这个问题。
  • 这里使用.map() 代替.forEach() 有什么重要原因吗?
  • 我只是喜欢使用地图。每个人都有自己的范围,所以对我来说似乎最干净。但不是。没有理由不能使用 forEach。
【解决方案2】:

这是一个使用.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);

【讨论】:

  • 您的代码已被盗 :) 请参阅bleepingcomputer.com/news/security/… 的第二张截图
  • @LucVdV 我的版本甚至不是那么好,哈哈!不过,这是一篇有趣的文章。谢谢你让我知道。 :)
【解决方案3】:

莫尔斯电文示例:

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

【讨论】:

    【解决方案4】:

    基于 2 个循环的另一种解决方案。由 split(" ") 对莫尔斯电码中的单词进行分隔 - (带有 3 个分隔符号) - 当它识别 3 个分隔符号时,它将莫尔斯电码拆分为单词。现在你有一个 x 字符串数组。为了访问莫尔斯电码中的每个元素(一个字母),您应该通过循环遍历字符串数组(您可以使用“map”)进行另一个拆分,但现在 带有 split(" ") -(带有 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();
    }
    

    【讨论】:

      【解决方案5】:
      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",
              "-.-.--":"!",
              ".-.-.-":".",
              "--..--":","
          };
      

      希望我的代码可以帮助到你。

      【讨论】:

        【解决方案6】:
        const MorseCode = str => {
        
            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 words = ''
            str.split(" ").forEach(cur => {
                if(cur === ""){
                    words += " "
                }else{
                    if(dictionary[cur]){
                        words += dictionary[cur]
                    }
                } 
            });
            return (words.split("  ")).join(" ")
        }
        
        const getPhrase = MorseCode(".... . -.--   .--- ..- -.. .")
        
        
        console.log(getPhrase);
        

        【讨论】:

        • 您能否就这如何回答问题添加某种解释?
        【解决方案7】:

        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(" "));

        这是为一个小写单词制作的,如您所见,它将文本转换为莫尔斯电码,而不是将莫尔斯电码转换为文本

        【讨论】:

          【解决方案8】:

          这是一个使用 .map()、.split()、.join() 和 .trim() 的方法。它在代码战上对我来说很好。莫尔斯电码表是为您预先加载的,作为 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);

          【讨论】:

            【解决方案9】:

            一个简单的 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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-05
              • 2015-09-03
              • 1970-01-01
              相关资源
              最近更新 更多