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
йому він:
- змінює
B
на O
- змінює
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.