Испытание: Великий дешифровщик

Чтобы охватить случаи переполнения, нужно просто делить с остатком.
Например, пусть алфавит состоит из 5 символов. У нас сообщение 45123 со сдвигом 2. То есть, изначальное сообщение было 12345. Прибавляем к зашифрованному 45123 сдвиг 2, получается 67345. Каждое из них делим по остатку на 5 - длину алфавита. Получается 12345.

for (let symbol of encodedSymbols) {
  decodedMessage += symbols[(symbol + shift) % symbols.length];
}
1 лайк
for (i = 0; i < encodedSymbols.length; i++) {

key = encodedSymbols[i] + shift;
if (key <= symbols.length) {
decodedMessage += symbols[key]
} else {
decodedMessage += symbols[key - symbols.length]
}
}

let decodedMessageArr = [];
let decodedMessage = ‘’;

for(let i = 0; i < encodedSymbols.length; i++) {
if(encodedSymbols[i] + shift < symbols.length) {
decodedMessageArr.push(symbols[encodedSymbols[i] + shift]);
} else {
decodedMessageArr.push(symbols[encodedSymbols[i] + shift - symbols.length]);
}

}
decodedMessage = decodedMessageArr.join(’’);
console.log(decodedMessage);

Первое время не мог понять причину ошибки с undefinded некоторых символов, оказывается решение описано в последнем абзаце задания(затупил). Вот мое решение, добавил коментарии вдруг кому-то понадобится:

let shift = 10;
let decodedMessage = '';

let symbols = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ' ', '.', ',', '—', '!'];

let encodedSymbols = [62,28,31,56,42,40,43,27,23,56,37,28,56,25,51,39,40,38,41,32,48,52,56,40,51,24,34,43,56,43,56,45,38,31,55,32,37,23,57];


for(i = 0; i < encodedSymbols.length; i++) {
//Расшифрованный индекс символа со смещением и проверкой на выход за пределы алфавита
  let encodedPosition = encodedSymbols[i] + shift;
  if (encodedPosition > symbols.length) {
    encodedPosition -= symbols.length;
  }
//Поиск символа в алфавите по индексу с последующим добавлением в строку
  let encodedSymbol = symbols[encodedPosition];
  decodedMessage += encodedSymbol;
}
console.log(decodedMessage);

Довольно просто

for (let i = 0; i < encodedSymbols.length; i++){
if (encodedSymbols[i] + shift > symbols.length){
decodedMessage += symbols[encodedSymbols[i] + shift - symbols.length];
} else {
decodedMessage += symbols[encodedSymbols[i] + shift]
}
}

Решение в одну строку в цикле для знакомых с модульной арифметикой

Моё решение
 // Алфавит
let symbols = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ' ', '.', ',', '—', '!'];

// Смещение
let shift = 10;

// Закодированное сообщение
let encodedSymbols = [8, 28, 36, 52, 56, 40, 23, 31, 56, 39, 38, 28, 48, 52, 58, 56, 38, 27, 32, 37, 56, 40, 23, 31, 56, 39, 38, 41, 39, 32, 57];

// Раскодированное сообщение
let decodedMessage = '';

for (let i = 0; i < encodedSymbols.length; i++) {
decodedMessage += symbols[(encodedSymbols[i] + shift) % symbols.length]
}

5 из 6, помогайте

for (i = 0; i < encodedSymbols.length; i++) {
if ((i + shift) > 71) {
decodedMessage = decodedMessage + symbols[encodedSymbols[i] + shift - 71];
}
else {
decodedMessage = decodedMessage + symbols[encodedSymbols[i] + shift];
}
}

for (let i = 0; i < encodedSymbols.length; i++) {
  if (encodedSymbols[i] + shift < symbols.length) {
    decodedMessage += symbols[encodedSymbols[i] + shift];
  } else {
    decodedMessage += symbols[encodedSymbols[i] + shift - symbols.length];
  }
}

console.log(decodedMessage);
for (let elem of encodedSymbols)
{ 
if (elem+shift<symbols.length)
    {
      decodedMessage+=symbols[elem+shift]
    }
else {
    decodedMessage+=symbols[elem+shift-symbols.length]
     }
}

Index должен быть >= symbols.length
Потому что последний символ алфавита имеет индекс symbols.length - 1

for (let i = 0; i < encodedSymbols.length; i++) {
  var decodIndex = encodedSymbols[i] + shift;

  if (decodIndex > symbols.length) {
    decodIndex -= symbols.length;
  } 
   
 decodedMessage += symbols[decodIndex];
};

У самого так получилось.

for (let i = 0; i < encodedSymbols.length; i++) {
  let decodedIndex = encodedSymbols[i] + shift
  if (decodedIndex > symbols.length) {
    decodedIndex -= symbols.length
    }
 
  decodedMessage += symbols[decodedIndex]
  
  } 

Но выше увидел решение элегантнее:

for (let symbol of encodedSymbols) {
  decodedMessage += symbols[(symbol + shift) % symbols.length];
}

Сижу, вникаю!

2 лайка
for (let i = 0; i < encodedSymbols.length; i++) {
  
  if (encodedSymbols[i] >= symbols.length - shift) {
     decodedMessage += symbols[(encodedSymbols[i] - symbols.length) + shift];
    }
  else {
    decodedMessage += symbols[encodedSymbols[i] + shift];
    }
  };

Получилось вот таким образом)

Спойлер

Итого

for (let i = 0; i < encodedSymbols.length; i++) {
  let index = encodedSymbols[i];
  let indexWithShift = index + shift;  
  
  if (indexWithShift > symbols.length) {
    indexWithShift = indexWithShift - symbols.length;
  }
    decodedMessage += symbols[indexWithShift]
}