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
函数(它可以作用于字符串,充当字符数组)。
- 地图函数文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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
我正在研究一种算法,我需要一些帮助。问题来了:
最简单和最广为人知的密码之一是凯撒密码,也称为移位密码。在移位密码中,字母的含义会移位一定数量。
一种常见的现代用法是 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
函数(它可以作用于字符串,充当字符数组)。
- 地图函数文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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