凯撒密码只得到第一个值的权利
Caesar cipher only gets first value right
我的凯撒密码只适用于第一个字母,我试过移动变量,使用嵌套的 for 循环,但似乎无法弄清楚。 FREE PIZZA
应该翻译成 SERR CVMMN
,但它给了我一堆奇怪的符号和小写翻译。
function rot13(str) { // LBH QVQ VG!
let x = str;
let y = [];
let n = ''
for(let i = 0; i < x.length; i++) {
y.push(x.charCodeAt(i) + 13)
console.log(x.charCodeAt(i))
}
console.log(y)
for(let j = 0; j < y.length; j++){
console.log(y[j])
n += String.fromCharCode(y[j])
}
console.log(n)
return n;
}
当您使用 charCode
时,您将获得字符的 unicode 值,对于大写英文字母表,这些值在 65–90 范围内。当你加 13 时,你得到字符 "NOPQRSTUVWXYZ[]^_`abcdefg" 的 unicode 值,这不是你想要的。
您需要找到一种方法,使英文字符仅映射到 13 步之外的英文字符,并进行环绕处理,以便后面的字符映射到前面的字符(以便 Z 映射到 M)。
如果您不再使用 unicode 值,而是使用您自己的字母表,这可能更容易实现,如下面的代码片段所示:
function rot13(str) {
let x = str.toUpperCase();
let y = [];
let n = "";
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (let i = 0; i < x.length; i++) {
if (alphabet.indexOf(x.charAt(i)) > -1) {
n += alphabet.charAt((alphabet.indexOf(x.charAt(i)) + 13) % 26);
} else {
n += x.charAt(i);
}
}
return n;
}
console.log(rot13("FREE PIZZA"));
一种更简单的方法是只使用查找 table(完全避免数学运算):
function rot13(str) {
let x = str.toUpperCase().split("");
let table = {
A: "N", B: "O", C: "P", D: "Q",
E: "R", F: "S", G: "T", H: "U",
I: "V", J: "W", K: "X", L: "Y",
M: "Z", N: "A", O: "B", P: "C",
Q: "D", R: "E", S: "F", T: "G",
U: "H", V: "I", W: "J", X: "K",
Y: "L", Z: "M"
};
for (let i = 0; i < x.length; i++) {
if (table[x[i]]) {
x[i] = table[x[i]];
}
}
return x.join("");
}
console.log(rot13("FREE PIZZA"));
我的凯撒密码只适用于第一个字母,我试过移动变量,使用嵌套的 for 循环,但似乎无法弄清楚。 FREE PIZZA
应该翻译成 SERR CVMMN
,但它给了我一堆奇怪的符号和小写翻译。
function rot13(str) { // LBH QVQ VG!
let x = str;
let y = [];
let n = ''
for(let i = 0; i < x.length; i++) {
y.push(x.charCodeAt(i) + 13)
console.log(x.charCodeAt(i))
}
console.log(y)
for(let j = 0; j < y.length; j++){
console.log(y[j])
n += String.fromCharCode(y[j])
}
console.log(n)
return n;
}
当您使用 charCode
时,您将获得字符的 unicode 值,对于大写英文字母表,这些值在 65–90 范围内。当你加 13 时,你得到字符 "NOPQRSTUVWXYZ[]^_`abcdefg" 的 unicode 值,这不是你想要的。
您需要找到一种方法,使英文字符仅映射到 13 步之外的英文字符,并进行环绕处理,以便后面的字符映射到前面的字符(以便 Z 映射到 M)。
如果您不再使用 unicode 值,而是使用您自己的字母表,这可能更容易实现,如下面的代码片段所示:
function rot13(str) {
let x = str.toUpperCase();
let y = [];
let n = "";
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (let i = 0; i < x.length; i++) {
if (alphabet.indexOf(x.charAt(i)) > -1) {
n += alphabet.charAt((alphabet.indexOf(x.charAt(i)) + 13) % 26);
} else {
n += x.charAt(i);
}
}
return n;
}
console.log(rot13("FREE PIZZA"));
一种更简单的方法是只使用查找 table(完全避免数学运算):
function rot13(str) {
let x = str.toUpperCase().split("");
let table = {
A: "N", B: "O", C: "P", D: "Q",
E: "R", F: "S", G: "T", H: "U",
I: "V", J: "W", K: "X", L: "Y",
M: "Z", N: "A", O: "B", P: "C",
Q: "D", R: "E", S: "F", T: "G",
U: "H", V: "I", W: "J", X: "K",
Y: "L", Z: "M"
};
for (let i = 0; i < x.length; i++) {
if (table[x[i]]) {
x[i] = table[x[i]];
}
}
return x.join("");
}
console.log(rot13("FREE PIZZA"));