JavaScript 指定密钥的恺撒密码实现

96 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天。

大家好,我正在自学前端,目前主要的学习途径是freeCodeCamp(以下简称fCC)和B站相关视频。在fCC学习过程中,有很多项目挑战。我想在这里记录自己通过这些挑战的过程。欢迎交流~

挑战题目:

image.png

背景知识:

freeCodeCamp JS算法和数据结构

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

解题思路:

恺撒密码的加密,实际上是字母位置的平移,在上面第二篇文章中介绍了加密的步骤:

image.png

看了文章后,我自己开始编写这个认证项目时,还是遇到很多问题。 首先,题目中已经规定了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;

但将代码输入到编码区后,出问题了。 image.png

除了第一个字母,剩下的字母都undefined。哪里出现问题了呢? 在使用数组前,再检查一下。 当我仔细查看 string.indexof() 的用法。发现它的语法是

indexOf(searchString, position)

让我们重新定义一个位置变量 position image.png

解码试试:

image.png

结果里,虽然空格占位符也被处理了,而且被处理了两遍,一遍是处理为了' ',一遍处理为'undefined'。所以需要改条件,增加else if语句,限定+rot[position]的条件。 image.png

芜湖~~~我真是个小机灵鬼 image.png

全部实现代码如下:

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】设计并实现“恺撒密码”

不预设密钥,编码、解码的过程,很完整。