js解码摩尔斯电码

时间:2017-05-01 20:50:22

标签: javascript morse-code

对于这个项目,我正在尝试解码给定的莫尔斯代码字符串。编码字符由单个空格分隔,单词由三个空格分隔。我越来越难以超越单词空间。我一直得到“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;
}

示例:“”.... -.--“” - .- - 。“” - &gt; “嗨,老兄” 对不起,奇怪的报价。它不会显示没有外部空间的空间。

9 个答案:

答案 0 :(得分:2)

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

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

或类似的东西。这个枚举不完整(大写,标点符号),但你明白了。

答案 1 :(得分: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);

答案 2 :(得分:2)

    decodeMorse = function( morseCode ) {
        morseCode = morseCode.split( "   " ); // get single words
        var result = "";
        
        for( var i = 0; i < morseCode.length; i ++ ) {
            morseCode[i] = morseCode[i].split( " " ); // get single characters
            
            for( let a = 0; a < morseCode[i].length; a ++ ) {
                if( morseCode[i][a] != "" ) {
                    result += MORSE_CODE[ morseCode[i][a] ];
                }
            }
            
            if( i < ( morseCode.length -1 ) ) {  // add space after word
                result += " ";
            }
            
        }
        
        return result.trim();
    }

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

在codewars.com上运行正常。如果不是codewars.com,则需要编写一个变量MORSE_CODE来定义像这样的摩尔斯字符:

    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",
        "-.-.--":"!",
        ".-.-.-":".",
        "--..--":","
    };

希望我的代码可以为您提供帮助。

答案 3 :(得分:1)

莫尔斯电文示例:

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 :(得分:1)

另一个基于2个循环的解决方案。通过split(“”)-(具有3个分隔符)在莫尔斯电码中分离单词的方式-当它识别3个分隔符时,将莫尔斯电码拆分为单词。现在您有了一个x字符串数组。为了访问摩尔斯电码中的每个元素(一个字母),您应该通过遍历字符串数组(您可以使用“地图”)进行另一次拆分,但是现在 带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 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

可以在 https://github.com/zizwiz/Convert-Text-to-Morse-and-Play-it 中找到一个简单的 C# 示例,允许将文本转换为 tp Morse,并将 morse 转换为 Text 并且还会播放 Morse。

使用间距如下

<summary>
Dot = 1 unit
Dash = 3 units

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