【问题标题】:Caesars Cipher / Shift Caesar code is not workingCaesars Cipher / Shift Caesar 代码不起作用
【发布时间】:2021-03-31 16:14:43
【问题描述】:

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

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

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

编写一个以ROT13编码字符串作为输入并返回解码字符串的函数。

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

这是我的代码

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 会恢复到原来的形式,并且什么都没有改变。有什么问题?

【问题讨论】:

    标签: javascript algorithm caesar-cipher


    【解决方案1】:

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

    您还可以使用数组的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
    

    【讨论】:

      【解决方案2】:

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

      newStr = newStr.replace(...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多