Caesars Cipher / Shift Caesar 代码不起作用

Caesars Cipher / Shift Caesar code is not working

我正在研究一种算法,我需要一些帮助。问题来了:

最简单和最广为人知的密码之一是凯撒密码,也称为移位密码。在移位密码中,字母的含义会移位一定数量。

一种常见的现代用法是 ROT13 密码,其中字母的值移动 13 位。因此 A ↔ N,B ↔ O 等等。

编写一个函数,将 ROT13 编码字符串作为输入,returns 解码字符串。

所有字母都将大写。不要转换任何非字母字符(即空格、标点符号),但要传递它们。

这是我的代码

function rot13(str) {
  let letters = ['a',"b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  let newStr = str.toLowerCase()

  for(let i = 0; i < newStr.length; i++){
    if(letters.indexOf(newStr[i]) > 13){
      newStr.replace(newStr[i], letters[letters.indexOf(newStr[i]) - 13])
    } else {
      newStr.replace(newStr[i], letters[letters.indexOf(newStr[i]) + 13])
    }
  }
  return newStr.toUpperCase();
}

console.log(rot13("SERR PBQR PNZC"));

我看到它把 newStr returns 的一个字母替换成原来的形式,什么都没有改变。有什么问题?

替换命令不会替换提供的字符串中的数据,而是returns进行替换的字符串。要更新 newStr 你需要

newStr = newStr.replace(...)

前面的答案是正确的(替换函数returns一个字符串,不对原始输入执行更新)。

您还可以使用数组的map函数(它可以作用于字符串,充当字符数组)。

function rot13(str, shiftAmt = 13) {
  const alphabetSize = 26
  const ord = character => character.charCodeAt(0)
  const baseOrd = ord("A")
  const index = character => ord(character) - baseOrd
  const char = charCode => String.fromCharCode(charCode)
  const shifted = character => char((index(character) + shiftAmt) % alphabetSize + baseOrd)

  const resultArr = Array.prototype.map.call(str.toUpperCase(), chr => chr >= "A" && chr <= "Z" ? shifted(chr) : chr)
  
  return resultArr.join("")
}
console.log(rot13("SERR PBQR PNZC"));

结果:

FREE CODE CAMP