我的代码需要帮助。我正试图解决凯撒密码问题,从我已经完成的阅读中我觉得我有点走上了正确的轨道。我是编码的新手,所以如果写得不好,我还有很多需要学习的东西。我试图做的是将字符串拆分成一个数组,并检查该数组的每个元素是否是一个字母。如果是,则使用 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? ...");
答案 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);
}