javascript - 凯撒密码不明白如何解决

标签 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? ...");

最佳答案

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

首先,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/

相关文章:

c# - 获取角色的替代代码

algorithm - 编码/纠错挑战

javascript - 如果在 Angular JS 中未选中复选框,则禁用按钮

javascript - 实现 NavigationView 时出现问题 - Sc.View 不可观察

javascript - 在 FolderIterator 和 FileIterator 上循环 - Google Apps 脚本

encoding - 在将特殊字符存储到数据库之前,是否应该对其进行HTML编码?

javascript - 使用相对位置和 top 属性来定位 Flexbox 的子元素(right 属性有效,但 top 无效)

javascript - Node JS 应用程序中未处理的错误

c - 为什么文件的字符数相同时文件大小不同?

php - Android 不显示特殊字符