Не понимаю почему не работает шифровка Цезаря

function rot13(message){
   message = message.toLowerCase();
   const alphabet = [...'abcdefghijklmnopqrstuvwxyz'];
   alphabet.forEach(letter=> {
      message.replace(letter, alphabet.indexOf(letter) + 13);
   });
      return message;
}
 console.log(rot13('i love you'));

Код должен шифровать текст определенным образом. Заменять каждую букву на 13-ую после нее. Я точно где-то ошиблась, но могу постараться объяснить свой алгоритм. В функцию принимаем сообщение. Оно приводится к LowerCase. Затем у нас есть массив алфавита. Мы проходимся по нему и каждую букву заменяем на letter + 13


Ответы (1 шт):

Автор решения: Швеев Алексей
  1. Вы не изменяете message. Метод message.replace ВОЗВРАЩАЕТ новую строку.

  2. Вы заменяете букву на номер этой буквы + 13. А вам же надо брать букву под полученным номером.

  3. Номер должен быть зациклен. Таким образом 27 буква должна стать первой. Для этого поможет оператор %

  4. Заменив вначале одну букву она может заменится потом. Для этого надо вначале перевести строку в номера букв, а только потом уже обратно в строку

  5. Вынести 13 стоит как параметр

Да и вообще легче пройтись по каждой букве сообщения, а не по каждой букве алфавита

Исправленный код:

function rot(message, n){
    message = [...message.toLowerCase()]
    const alphabet = [...'abcdefghijklmnopqrstuvwxyz'];
    message.forEach((letter, i) => {
        let index = alphabet.indexOf(letter);
        if (index<0) {return;}
        message[i] = alphabet[(index + n) % alphabet.length]
    });
    return message.join("");
}
→ Ссылка