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

Подскажите, как склеить все значения 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];
}

мое решение что-то длинновато

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

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

// Закодированное сообщение
var encodedMessage = [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];

// Раскодированное сообщение
var decodedMessage = ‘’;
var rowMessage = [];
var encodedShift = [];
for (var i = 0; i <= encodedMessage.length; i++) {
encodedShift.push(encodedMessage[i] + shift);
}

console.log(encodedShift);

for (var i = 0; i <= encodedShift.length; i++) {
if(encodedShift[i] > symbols.length) {
rowMessage.push(symbols[encodedShift[i] - symbols.length]);
}
else {
rowMessage.push(symbols[encodedShift[i]]);
}
}

decodedMessage = rowMessage.join(’’);
console.log(decodedMessage);

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

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

// Закодированное сообщение
var encodedMessage = [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];

// Раскодированное сообщение
var decodedMessage = ‘’;

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

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

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