使用JavaScript编码morsecode

时间:2014-09-26 12:05:59

标签: javascript

我试图以最简单的方式将任何文本字符串转换为摩尔斯电码。我对编程很陌生,所以请你给我一些关于我可以用什么方法的建议。

到目前为止,我刚刚编写了一个短语(字符串)和一个包含摩尔斯电码的数组,但我正在努力解决下一步如何使用字符串的每个字符然后用数组检查并打印出来的步骤摩尔斯电码相当于字符串。

var phrase = "go down like a lead balloon";

var morseCode = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-",     ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]

for(i=0; i<phrase.length; i++){

c = phrase.charAt(i);

WScript.echo(c + " | " + i);
}  

3 个答案:

答案 0 :(得分:9)

您可以使用字典,如下所示:

var alphabet = {
    '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': '-----', 
}

"This is a sentence containing numbers: 1 2 3 4 5"
    .split('')            // Transform the string into an array: ['T', 'h', 'i', 's'...
    .map(function(e){     // Replace each character with a morse "letter"
        return alphabet[e.toLowerCase()] || ''; // Lowercase only, ignore unknown characters.
    })
    .join(' ')            // Convert the array back to a string.
    .replace(/ +/g, ' '); // Replace double spaces that may occur when unknow characters were in the source string.

// "- .... .. ... / .. ... / .- / ... . -. - . -. -.-. . / -.-. --- -. - .- .. -. .. -. --. / -. ..- -- -... . .-. ... / .---- / ..--- / ...-- / ....- / ....."

答案 1 :(得分:4)

首先,您必须剥离所有可以编码的字符:

phrase = phrase.toLowerCase().replace(/[^a-z]/g, "");

使用replaceregular expression,您最终会得到一串只有字母字符的字符串。为了简洁,我们还将所有字母转换为小写。

然后,在for循环中:

c = phrase.charCodeAt(i);

这会将字母转换为等效的ASCII码值。相应的摩尔斯电码将为morseCode[c - 97]

正如Gerald Schneider建议的那样,您也可以使用数字改进此编码,但代码会更复杂。

答案 2 :(得分:0)

如前所述,您可以将数组转换为对象以进行一对一映射。这样您就不必担心错误的字符进入输出,因为解码函数会在它们不作为密钥出现时将其过滤掉。

var morseObj = {};
for (var i = 97, l = 97 + morseCode.length; i < l; i++) {
  morseObj[String.fromCharCode(i)] = morseCode[i - 97];
}

然后有一个解码功能:

function encode(sentence) {
  var output = '';
  for (var i = 0, l = sentence.length; i < l; i++) {
    var letter = sentence[i].toLowerCase();
    if (morseObj[letter]) { output += morseObj[letter] + ' '; }
  }
  return output;
}

encode('My name is Andy'); // "-- -.-- -. .- -- . .. ... .- -. -.. -.-- "

DEMO