Caesars Cipher不懂如何解决

时间:2016-01-24 01:59:55

标签: javascript encoding

我的代码需要帮助。我正试图解决凯撒密码问题,从我已经完成的阅读中我觉得我有点走上了正确的轨道。我是编码的新手,所以如果写得不好,我还有很多需要学习的东西。我试图做的是将字符串拆分成一个数组,并检查该数组的每个元素是否是一个字母。如果是,则使用 charCodeAt() fromCharcode()函数将字母转换为新字母。我设法只用一个字母单独完成这个,但是当它进入循环时就搞砸了。如果有人能给我一些关于我做错的提示,或者即使我朝着正确的方向前进,我将不胜感激。谢谢!

function rot13(str) {  

var splitArr = str.split('');  
var newArr = [ ];  

    for (var i = 0; i < str.length; i++){  
      if (isLetter(splitArr[i]) === true){  
        newArr = String.fromCharCode(splitArr.charCodeAt(splitArr.length[i]) + 13);  
    } else {  
        newArr.push(splitArr[i]);  
       }  
    }  
        return  newArr.join("");  
}

function isLetter(str) {  
return str.length === 1 && str.match(/[A-z]/i); //checks if its a letter  
}


// Change the inputs below to test  
rot13("AB? ...");

1 个答案:

答案 0 :(得分:1)

你有正确的想法,但你对细节很模糊。

首先,charCodeAt适用于字符串,而不是数组,因此您不必先将字符串拆分为数组。正如方法的名称所示,您要求字符串字符串中的给定位置。

其次,splitArr.length[i]没有意义 - 在数组上调用.length会返回一个数字,然后你不能转而使用下标;例如['a','b','c'].length[i]变为3[i]

第三,在做腐烂13时,你必须确保将结果保留在字母表中。 A的字符代码是65,添加13可以根据需要获得78,即N - 很棒。但是N也应该转回A,而添加13到78可以获得91,这是一个左括号([)。

通常的方法是减去'A'的字符代码(如果它是小写的话,则为'a'),加13,取结果 modulo 26(即除以后的余数)通过26),并将其添加回'A'的字符代码。

这是一个函数(fiddle),它将使单个字符串变为单个字符串。您应该能够修改它以执行任何长度的字符串:

var Acode = "A".charCodeAt(0);
var Zcode = "Z".charCodeAt(0);
var aCode = "a".charCodeAt(0);
var zCode = "z".charCodeAt(0);

function rot13singleChar(ch) {
  var code = ch.charCodeAt(0);
  if (code >= Acode && code <= Zcode) {
    code = (code - Acode + 13) % 26 + Acode;
  } else if (code >= aCode && code <= zCode) {
    code = (code - aCode + 13) % 26 + aCode;
  }
  return String.fromCharCode(code);
}