Когда вы используете charCode
, вы получаете значения символов Unicode, которые находятся в диапазоне 65–90 для заглавного английского алфавита.Когда вы добавляете 13, вы получаете значения Unicode для символов «NOPQRSTUVWXYZ [] ^ _` abcdefg », а это не то, что вам нужно.
Вам нужно найти способ заставить только английские символы отображаться наанглийский символ 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"));
Еще более простой подход состоит в том, чтобы просто использовать справочную таблицу (без математики в целом):
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"));