在JS中使用Shift Cipher(ROT-13)函数和String.fromCharCode的问题

时间:2016-03-21 19:20:57

标签: javascript function caesar-cipher fromcharcode

尝试使JS函数工作,将字符串中的各个字符移动一定量(然后返回新的“移位”字符串)。我正在使用ROT-13(因此A-M向下移动13个字符,N-Z向上移动13个字符)。

问题在于这段代码:

if (arr[i] <= 77) {
    finalStr += String.fromCharCode(arr[i] + 13);

此代码应将E移至R.

E(69)+ 13 = R(82)

但是,返回的字符串中应该向下移动13个空格的字符将作为奇怪的符号返回。

“FᬁEE಍Ç᧕DE಍CAMᨹ”

function rot13(str) {
  var newStr = "";
  var finalStr = "";
  for (i = 0, j = str.length; i < j; i++) {
    newStr += str.charCodeAt(i);
    newStr += " ";
  }
  var arr = newStr.split(" ");
  arr.pop();
  for (i = 0, j = arr.length; i < j; i++) {
    if (arr[i] !== 32) {
      if (arr[i] <= 77) {
        finalStr += String.fromCharCode(arr[i] + 13);
      }
      else {
        finalStr += String.fromCharCode(arr[i] - 13);
      }
    }
  }
  return finalStr;
}

rot13("SERR PBQR PNZC");

3 个答案:

答案 0 :(得分:0)

问题似乎不是您所识别的问题,而是您处理从字符到字符代码的转换。简化和清理转换逻辑似乎可以解决问题:

function rot13(str) {

    var arr = new Array();

    for (var i = 0; i < str.length; i++) {
        arr[arr.length] = str.charCodeAt(i);
    }

    var finalStr = "";

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] !== 32) {
            if (arr[i] <= 77) {
                finalStr += String.fromCharCode(arr[i] + 13);
            } else {
                finalStr += String.fromCharCode(arr[i] - 13);
            }
        } else {
            finalStr += String.fromCharCode(32);
        }
    }

    return finalStr;
}

rot13("SERR PBQR PNZC");

返回&#34;免费代码营地&#34;。

答案 1 :(得分:0)

只是为了更多地吹嘘你的想法:

var rot13=function(str){
  return str.split('')
    .map(function(ch){
      var v=ch.charCodeAt(0); 
      return String.fromCharCode(v > 77 ? v-13 : v+13);
    })
    .join('');
};

UPDATE - 处理大写和小写字母的版本

var rot13 = function(s){
    return s.split('').map(function(c){
      var v=c.toLowerCase().charCodeAt(0);
      if(v<97 || v>122) return c;
      var t = v>=96,
          k = (v - 96 + 12) % 26 + 1;
      return String.fromCharCode(k + (t ? 96 : 64));
  }).join('');
};

rot13('SERR PBQR PNZC') // => FREE CODE CAMP

答案 2 :(得分:0)

刚才有一个想法:为什么不在一条线上做呢?顺便说一句,我查看了免费代码营的挑战,你必须绕过所有非字母数字字符。 这是

function rot13(str) { // LBH QVQ VG!
  return str.split('').map(function(letter){
    return letter.match(new RegExp(/\W/i)) ? letter : (letter.charCodeAt(0) <= 77 ? String.fromCharCode(letter.charCodeAt(0) + 13) : String.fromCharCode(letter.charCodeAt(0) - 13));
  }).join('');
}

// Change the inputs below to test
rot13("SERR PBQR PNZC"); // FREE CODE CAMP

TADAAAAH : - )

以下是笔:http://codepen.io/liorchamla/pen/mPwdEz/

希望你会喜欢它,并希望你会努力理解这一点!

快乐免费代码营给所有人!