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

Подскажите, как склеить все значения decodedMessage после цикла?

var decodedMessage = ' ';

var decoded = 0;
for (var i = 0; i <= encodedMessage.length - 1; i++) {
  decoded = encodedMessage[i] + shift;
  if (decoded >= symbols.length - 1) {
    decoded = decoded - symbols.length;
  }
  decodedMessage = symbols[decoded];
  console.log(decodedMessage);
}

ответ найден

Видимо я тупой, сидел минут 40. ничего не решил.

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

for (var i = 0; i <= encodedMessage.length - 1; i++) {
decodedMessage += symbols[encodedMessage[i] + shift];
if (encodedMessage[i + shift] >= symbols.length - 1) {
decodedMessage += symbols[encodedMessage[i - symbols.length - 1] + shift];
}
}

Почему-то проходит 5 проверок из 6. Вместо буквы Б пишет undefined

неправильная проверка у тебя.
if (encodedMessage[i + shift] >= symbols.length - 1)
не i+shift, а encodedMessage[i] + shift должно быть.

мой вариант:
var encodedMessage = [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];
var index=0;
// Раскодированное сообщение
var decodedMessage = ‘’;

for (var i=0; i<encodedMessage.length; i++){
if((encodedMessage[i]+shift)<=symbols.length){
index = encodedMessage[i] + shift;
decodedMessage += symbols[index];
}
else{
index = encodedMessage[i] + shift - symbols.length;
decodedMessage += symbols[index];
}
}
console.log(decodedMessage);

Знаю, что можно было обойтись без доп переменной, но с ней код становится более читабельным и понятным.

Мой вариант решения:

for (var i = 0; i < encodedMessage.length; i++) {

    if (encodedMessage[i]+shift > symbols.length - 1) {

        decodedMessage +=  symbols[((encodedMessage[i]+shift) - (symbols.length - 1))-1]   

    }

    else {

        decodedMessage += symbols[encodedMessage[i]+10]

    }

}

Тут:

if (encodedMessage[i]+shift > symbols.length - 1)

вы сравниваете индекс с длинной алфавита -1, а нужно просто с длинной, из за аналогичной ошибки вам приходиться дополнительно отнимать единицу вот тут:

...(symbols.length - 1))-1]

В общем если избавиться от -1 все будет ОК.
Ну и вопрос зачем в одном случае использовать переменную shift, а в другом просто прописывать 10, если хотели добиться универсальности то и в последней строке стоит использовать переменную.

1 Симпатия

Спасибо за замечания.
10 вместо переменной прописал в конце машинально, читая условие.
А единицу отнимал из-за того, что позабыл что (.length) начинает счет с 1, а не с 0.

ИМХО, проще не задумываться от куда идет счет, а представить что (.length) = количество элементов.

Мой вариант через .map:

let sl = symbols.length;
let decodedMessage = encodedMessage.map(a=>a=symbols[(a+shift)%sl]).join(’’);

Моё решение

for(var i = 0; i < encodedMessage.length; i++) {

if(encodedMessage[i]+shift > symbols.length) {
decodedMessage += symbols[((encodedMessage[i] + shift) - symbols.length)];

}
else {
decodedMessage += symbols[encodedMessage[i] + shift];
}
}

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