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

Сделал так все работает.
for (i=0;i<encodedMessage.length;i++){decodedMessage +=symbols[encodedMessage[i]];
};

Не могу только понять зачем +shift люди выше в комментах пишут?

потому что вы не в то задание смотрите. вы проходите тесты в теории “Начинающий дешифровщик”, а тут собрались любители “практики” “Великий дешифровщик”. Там задание усложнено тем, что код смещен еще. Т.е. код цезаря.

заодно снова прошел
for (var i = 0; i < encodedMessage.length; i++) { // проходим по шифровке
  if (encodedMessage[i] + shift > symbols.length) { // если находим значение, которое вместе со смещением дает число, превышающее длину алфавита
  encodedMessage[i] -= symbols.length; // то вычитаем из него длину алфавита и перезаписываем его туда же в шифровку
  } // в этот момент все позиции шифровки имеют "приятный" вид
  decodedMessage += symbols[encodedMessage[i]+shift];  // добавляем символы алфавита, используя смещение по шифровке
}

@GreenLera у меня предложение по заданию “Великий дешифровщик 2.0” (или какой там, вдруг уже сделали)
все то же самое, но:
значение смещения и/или шифровки многократно превышают длину алфавита

1 Симпатия

Понял. спасибо . буду добираться до великого. ну можно ещё усложнить меняя величину смещение после каждой буквы.

1 Симпатия

Вот это класс: encodedMessage[i] -= symbols.length; // то вычитаем...

Я тут про 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 = '';

for (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];
   }
}

console.log(decodedMessage);

но вариант @Hierumo нравится больше

decodedMessage = encodedMessage.reduce((acc, curr) => {
let nextShift = curr + shift;

if (curr + shift > symbols.length) {
nextShift = nextShift - symbols.length;
}

return acc + symbols[nextShift];
}, ‘’);

Пожалуйста, помогите найти ошибку в коде. На третьей проверке выдаёт результат “undefinedез труда не выпросишь рыбку у хозяина.” То есть не расшифровывается только один символ, Б. Никак не пойму, в чем дело.

Код

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

В вашем коде условие (index > symbols.length) переопределяет значение index, но после этого ничего не происходит в программе, потому что присвоение decodedMessage было выше. Нужно поменять последние две строчки местами.

Как прятать таким образом? Куда нажимать чтобы код скрылся?

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

if (index <= symbols.length) {
decodedMessage += symbols[index];
} else {
decodedMessage += symbols[index-symbols.length];
}

}

console.log(decodedMessage);`

Нe очень элегантно, но работает

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 - 1; i++) {
if (encodedMessage[i] + shift > symbols.length - 1) {
decodedMessage = decodedMessage + (symbols[encodedMessage[i] + (shift - symbols.length)]);
} else{
symbols[encodedMessage[i] + shift];
console.log(symbols[encodedMessage[i] + shift]);
decodedMessage = decodedMessage + symbols[encodedMessage[i] + shift]
}
}

объясните пожалуйста, почему таким образом работает, а если вместо второй ветки раскоментировать ветку елсе, то не работает?

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

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

// Смещение
var shift = 10;
console.log(symbols.length)
// Закодированное сообщение
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 decod = [];

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

я сделал так
for(var i = 0; i <= encodedMessage.length - 1; i++){
var index = encodedMessage[i] + shift;
if(index > symbols.length){
var Index = index - symbols.length
index = Index
}
console.log(index)
var symbol = symbols[i]
decodedMessage+=symbols[index]
}

Моя реализация)

// Алфавит

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 lengthSymbos = symbols.length;

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

console.log(decodedMessage);

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

Добрый день!
Откуда в решении задачи оказалась переменная shift? Что это?
Подскажите, пожалуйста.

shift = 10; указано смещние по алфавиту. Ключ спощу которого можно расшифровать данные.

Извиняюсь, перепутал задание, только до него дошел. Не мог понять, откуда у всех есть значение shift.

Мое решение, для активности форума ;)
// Раскодированное сообщение
var decodedMessage = '';

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