0

试图让一个 JS 函数工作,将字符串中的单个字符移动一定量(然后返回新的“移位”字符串)。我正在使用 ROT-13(因此 AM 向下移动 13 个字符,NZ 向上移动 13 个字符)。

问题在于这段代码:

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

此代码应将 E 转换为 R。

E (69) + 13 = R (82)

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

“FᬁEE಍C᧕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");
4

3 回答 3

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

返回“免费代码营”。

于 2016-03-21T19:59:16.667 回答
0

刚刚有了一个想法:为什么不只在一条线上做呢?顺便说一句,我看了 Free Code Camp 挑战,你必须绕过所有非字母数字字符。这是

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/

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

祝大家免费代码营快乐!

于 2016-03-25T07:41:53.227 回答
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
于 2016-03-21T20:19:11.557 回答