我的代码需要帮助。我正在尝试解决凯撒密码问题,从我所做的阅读来看,我觉得我在某种程度上走在正确的轨道上。我是编码新手,所以我还有很多东西要学习,以防这看起来写得不好。我想做的是将字符串拆分为一个数组,并检查该数组的每个元素是否都是字母。如果是,则使用 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? ...");
最佳答案
你的想法是正确的,但你对细节很模糊。
首先,charCodeAt
适用于字符串,而不是数组,因此您不必先将字符串拆分为数组。正如该方法的名称所示,您要求提供字符串中给定位置的字符代码。
其次,splitArr.length[i]
没有意义 - 在数组上调用 .length
会返回一个数字,您无法将其反转并下标;例如['a','b','c'].length[i]
变为 3[i]
。
第三,在进行 rot 13 运算时,必须确保结果在字母表内。 A
的字符代码是 65,加上 13 就得到 78,即 N
,如您所愿 - 太棒了。但是 N
也应该转回 A
,并且将 13 添加到 78 得到 91,这是一个左括号 ([
)。
通常的做法是减去'A'(如果是小写则为'a')的字符代码,加上13,将结果模 26(即除以后的余数) 26),并将其添加回“A”的字符代码。
这是一个函数 ( fiddle ),它将 rot13 单字符字符串。您应该能够修改它以执行任意长度的字符串:
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);
}
关于javascript - 凯撒密码不明白如何解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34971388/