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

Сколько в symbols элементов?

Так и есть. В последней фразе “Б” не выбирается.

"undefinedез труда не выпросишь рыбку у хозяина."

1 лайк

Спасибо ребят! теперь я всё осознал )):mortar_board:

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

Такой вариантик…

Посмотрел все варианты и нигде не нашел выполнения условия с 71 знаком (если 62, то это 62+10-71), в моем варианте оно учитывается

Мой вариант
for (var i = 0; i < encodedMessage.length; i++) {

if (encodedMessage[i] <= 61) {
decodedMessage += symbols[encodedMessage[i] + shift];
} else {
decodedMessage += symbols[encodedMessage[i] + shift - 71];
}
}

такой вариант .

код

var decodedMessage = [’’];
var index = 0 ;

for (var i = 0 ; i <= encodedMessage.length ; i++ ) {
decodedMessage[index++]=symbols.join(’’)[encodedMessage[0+i]]
}

Друзья, я вот вообще не понял этого задания. Может кто то прям разжевать по каждой строке, вот хоть убейте не могу разобраться.
UPD. Немного разобрался, теперь не могу понять зачем вы сочиняете такие сложные коды, если все работает на:
for (var i = 0; i <= encodedMessage.length - 1; i++)
{
decodedMessage += symbols[encodedMessage[i]];
}

1 лайк

Это работает на предыдущем задании по дешифровке, без смещения…

Мой вариант, по-моему намудрил, что скажете :slight_smile:

Великий дешифровщик
console.log('Программа "Великий дешифровщик" by Nerealist');

// Алфавит
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];
console.log('Шифр ...... : ' + encodedMessage);

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

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

console.log('..... Расшифровка ..... готово : ' + decodedMessage);
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 - 1; 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;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]
}
}