【JS】恺撒密码ROT13解码程序(fCC认证项目)
背景知识:
如何给恺撒密码编程:基本加密简介((#.#)我翻译哒)
https://devdocs.io/javascript/global_objects/string/indexof
解题思路:
恺撒密码的加密,实际上是字母位置的平移,在上面的文章中介绍了加密的步骤:
最后用JAVA代码呈现。
看了文章后,我自己开始编写这个认证项目时,还是遇到很多问题。
首先,题目中已经规定了ROT13加密规则,即将明文中的字母向后移13位。(这样其实降低了难度,但我仍然不太会嘤)
这个规则的方便之处在于,我们可以直接设置一张正常的字母表和一张ROT13字母表用来遍历。
这一步还是会的:
const rot0 = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
const rot13 = ‘NOPQRSTUVWXYZABCDEFGHIJKLM’
其次,需要编写的是解码函数,也就是要倒着来。
那么,输入的字符串,比如‘AB’,输出就要是‘NO’。那么就要将str每一位上的字符在rot0中进行一一遍历,再输出rot13上对应位置的字符,遇到空格、标点等符号,保留原样。
那么在比对之前,要加一个筛选:
let newStr='';
for( let i =0;i<str.length;i++){
if(str[i].indexOf(rot0)===-1){
newStr = newStr + str[i];
}
newStr = newStr + rot[str[i].indexOf(rot0)];
}
return newStr;
将代码输入到编码区后,出问题了。
每个字母都undefined。哪里出现问题了呢?
在使用数组前,再检查一下。
一个检查点在indexOf的用法
果然是有问题的。。。重新定义一个位置变量position
最后解码的结果是
接下来怎么把undefined去掉?
在最后的结果里,虽然空格被处理了两遍,那么需要改if条件,增加else if语句,限定+rot[position]的条件。
芜湖~~~
实现代码如下:
function rot13(str) {
str.toUpperCase;
const rot0 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const rot = 'NOPQRSTUVWXYZABCDEFGHIJKLM';
let newStr = '';
for (let i = 0; i < str.length; i++) {
let position = rot0.indexOf(str[i]);
console.log(position)
if (position === -1) {
newStr = newStr + str[i];
} else if (position !== -1) {
newStr = newStr + rot[position];
}
}
return newStr;
}
console.log(rot13("SERR PBQR PNZC"));
补充资料:
【JS】设计并实现“恺撒密码”包含编码和解码的过程,很完整。
优化:
1 可以使用补充资料中提及的String.prototype.charCodeAt()字符串方法,来替代rot0和rot
2

浙公网安备 33010602011771号