Проєкти «Алгоритми JavaScript та структури даних» - Шифр Цезаря

Can anyone say what I’m doing wrong please?

function rot13(str) {
  let arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let alph = arr.split("")
for(let i=0; i < alph.length; i++){
  for(let x = 0; x < str.length; x++){
    if(alph[i].indexOf(str[x].match(/[A-M]/)) != -1) {
      str = str.replace(str[x], alph[i+13])
    }
    if(alph[i].indexOf(str[x].match(/[N-Z]/)) != -1){
      str = str.replace(str[x], alph[i-13])
    }
  }
}

 
  // console.log(alph)
  return str;
}

console.log(rot13("SERR PBQR PNZC"));

Інформація про ваш браузер:

Агент користувача: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36

Завдання: Проєкти «Алгоритми JavaScript та структури даних» - Шифр Цезаря

Посилання на завдання:

ваш алгоритм змінює деяки літери 2 раза.
Наприклад якщо SERR PBQR PNZC йому він:

  1. змінює B на O
  2. змінює O на B
    а в кінці у вас буде
FEEE CBDE CAMC
FREE CODE CAMP 
      |
     2 рази

p.s:
питайте ще…
(бо це не підсказка а тільки факти)

p.p.s:
моє трасування вашого коду

alph[i] B 1
str[x] B 6
proposed O
str before SERR PBQR PNZC
str afterr SERR POQR PNZC             ->1 раз !!!
real       FREE CODE CAMP

alph[i] C 2
str[x] C 13
proposed P
str before SERR POQR PNZC
str afterr SERR POQR PNZP

real       FREE CODE CAMP
alph[i] E 4
str[x] E 1
proposed R
str before SERR POQR PNZP
str afterr SRRR POQR PNZP
real       FREE CODE CAMP

alph[i] N 13
str[x] N 11
proposed A
str before SRRR POQR PNZP
str afterr SRRR POQR PAZP
real       FREE CODE CAMP

alph[i] O 14
str[x] O 6
proposed B
str before SRRR POQR PAZP
str afterr SRRR PBQR PAZP     -> 2 раз !!!
real       FREE CODE CAMP

також я би вам порадив не змінювати str а зробити нову змінну newStr в яку записувати змінені літери.
бо це не дуже гарно що ви змінюєте ввід, комусь ввід може бути потрібен
наприклад

let safeInput = "SERR PBQR PNZC";
let output = rot13(input);

наприклад:

function rot13(str) {
  let newStr ="";
  //..
  newStr += alph[i - 13]; // або alph[i + 13]
  //..
  return newStr;
}

``

також я не зрозумів навіщо вам цикл for (let i = 0; i < alph.length; i++). Ви завжди знаєете що він дає літери від A до Z.
Ви можете лише взяти звідси літеру на 13 позіції вліво чи вправо від літери яку требя поміняти.
І тоді у вас замість двох циклів буде лише 1.