【JS】恺撒密码ROT13解码程序(fCC认证项目)

背景知识:

fCC JS算法和数据结构

如何给恺撒密码编程:基本加密简介((#.#)我翻译哒)

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

posted @ 2022-11-08 15:52  dake0913  阅读(233)  评论(0)    收藏  举报