Почему мой код Цезаря пропускает некоторые символы? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть код ниже для Цезаря, который увеличивается на 13 символов для каждого входного символа. Он работает практически для всех входов, но, похоже, будет пропускать случайные символы. Я просто не могу понять, почему ?! Я все еще учусь, так что любая помощь была бы фантастической!

Ввод - это кодированная строка символов, которая будет выводиться при перемещении каждого знака на 13 позиций вперед. Ожидаемый результат должен быть читаемой строкой.

Если я введу rot13 ('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.'), Я бы ожидал, что «БЫСТРЫЙ КОРИЧНЕВЫЙ ФОКС ПЕРЕХОДИТ НА ЛЕНЮ СОБАКУ». Но вместо этого я получаю 'THEQUICKBROWNFBXJHMPS BVREGURLAZYDBG.'

Я ценю, что это может быть дубликатом, но я пока не смог найти ответ на эту конкретную проблему.

function rot13(str) {
  
  let newStr = [];

  for (let i = 0; i < str.length; i++) {
    let charNum = str.charCodeAt(i);
    console.log(charNum);
    if (charNum > 64 && charNum < 78) {
      let res = str.replace(str[i], String.fromCharCode(charNum + 13));
      newStr.push(res[i]);
    } else if (charNum > 77 && charNum < 91) {
      let res = str.replace(str[i], String.fromCharCode(charNum - 13));
      newStr.push(res[i]);
    } else {
      newStr.push(str[i]);
    }
  }

  console.log(newStr);
  return newStr.join(" ");
}

rot13('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.');

Ответы [ 2 ]

1 голос
/ 25 октября 2019

String.fromCharCode(charNum + 13) & String.fromCharCode(charNum - 13) - это все, что вам нужно. Вам не нужно заменять символ с индексом i в str.

newStr.push(String.fromCharCode(charNum + 13));
newStr.push(String.fromCharCode(charNum - 13));
0 голосов
/ 25 октября 2019

Проблема в вашем втором состоянии:

let res = str.replace(str[i], String.fromCharCode(charNum - 13));

Но даже без этого ваш код перегружен. Немного измененная версия

function rot13(str) {
  let newStr = [];

  for (let i = 0; i < str.length; i++) {
    let charNum = str.charCodeAt(i);
    //console.log(charNum);
    if (charNum > 64 && charNum < 78) {
      let res = String.fromCharCode(charNum + 13);
      newStr.push(res);
    } else if (charNum > 77 && charNum < 91) {
      let t = charNum + 13 - "Z".charCodeAt(0);
      let res = String.fromCharCode("A".charCodeAt(0) - 1 + t);
      newStr.push(res);
    } else {
      newStr.push(str[i]);
    }
  }

  return newStr.join(" ");
}

Есть даже лучшие решения, но для новичка это должно быть сделано.

...