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

Мой код

for (var i = 0; i < encodedMessage.length; i++) {
var shiftedMessage = encodedMessage[i] + shift;

decodedMessage += shiftedMessage > symbols.length ?
symbols[(shiftedMessage-symbols.length)] :
symbols[shiftedMessage];
}

Мой вариант

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

Условие не универсально.

Меньше фигурных скобок, если после проверки условия, только одна строка, то скобки использовать не обязательно
for (var i = 0; i < encodedMessage.length; i++) {
  if (encodedMessage[i]+shift <= symbols.length) 
    var index = encodedMessage[i]+shift;
     else index = encodedMessage[i]+shift- symbols.length;
  decodedMessage +=symbols[index];
}
console.log(decodedMessage);
И еще с помощью тернарной условной операции
for (var i = 0; i < encodedMessage.length; i++) {
  var index = 0;
  encodedMessage[i]+shift <= symbols.length ? index = encodedMessage[i]+shift : index = encodedMessage[i]+shift- symbols.length;
  decodedMessage +=symbols[index];
}
console.log(decodedMessage);

Ps: При использовании цикла for фигурные скобки обязательны. Вроде) если нет, то думаю меня поправят)

у меня так получилось

Summary

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

Мой вариант

Summary

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

Summary
// Раскодированные символы
var decodedSymbols = [];


//Получаю массив с раскодированными символами

for (var i = 0; i < encodedMessage.length; i++ ) {
  decodedSymbols[i] = encodedMessage[i] + shift;

    if (decodedSymbols[i] > symbols.length) {
    decodedSymbols[i] -= symbols.length;
    }

}

//Собираю строку
for (var j = 0; j < decodedSymbols.length; j++ ) {
  decodedMessage += symbols[decodedSymbols[j]];
}

Мы не знаем как работает программа шифровальщик, поэтому вариант с проверкой не универсальный. Например encodedMessage[8] должен иметь то же значение, что и элемент encodedMessage[8 + symbols.length]

По этому мой вариант:
for (var i = 0; i < encodedMessage.length; i++) {
decodedMessage += symbols[(encodedMessage[i] + shift) % symbols.length];
}

Я, конечно, вообще тупил с этим заданием полтора часа и только, прочитав чужие коды, понял, что можно было сократить в 2 раза и не забивать лишними переменными((
А собственное решение такое:

Код

44

P.S. правда решил идти через сложный вариант со стиранием запятых из массива :smiley: для этого пришлось изучать более углубленно на learn-js)

Добрый день.Мой вариант прошу критику.:blush:

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

2 лайка

Вот вроде всё правельно выдаёт но при проверке на 3ем этапе виснет (и проверка фейлит).
В чём беда?

code

1

Сравните с решениями выше

я не думаю что у этой задачи только одно верное решение, меня интересует почему мой вариант не принимается хотя он работает и первые две проверки проходит (потом виснит)

Либо предоставьте больше информации, либо все таки сравните решения) все решают через циклы, поэтому решения плюс минус одинаковы

1 лайк

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++){
decodedMessage +=symbols[encodedMessage[i]+shift];
}

А ошибка какая? Как мне кажется, на какой-то итерации у вас идёт обращение к элементу массива, которого не существует

А зачем нужна переменная shift? Просто если её убрать здесь [encodedMessage[i]+shift] , то нормально работает.

Идея же в том сообщение зашифровано, без shift получим такое же сообщение, как и до задачи

Ага, тогда понятно.
Я перепутала с испытанием «Начинающий дешифровщик».

Ошибки нет просто виснет после второй проверки