Цезарь шифр получает только первое значение правильно

Мой Цезарь шифр работает только для первой буквы, я пробовал перемещать переменные, используя вложенный цикл 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;
}

1 ответ

Решение

Когда вы используете charCode Вы получаете значения символов Unicode, которые находятся в диапазоне 65–90 для заглавного английского алфавита. Когда вы добавляете 13, вы получаете значения Unicode для символов "NOPQRSTUVWXYZ[]^_`abcdefg", что не то, что вы хотите.

Вам нужно найти способ сделать так, чтобы только английские символы отображались на английский символ в 13 шагах от вас, и сделайте так, чтобы более поздние символы отображались на более ранние (так, чтобы Z отображался на M).

Этого, вероятно, легче достичь, если вы отбросите значения юникода, а не свой собственный алфавит, как показано ниже:

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"));

Другие вопросы по тегам