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


#46

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


#47

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

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


#48

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


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

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


#50

Посмотрел все варианты и нигде не нашел выполнения условия с 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];
}
}


#51

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

код

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

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


#52

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


#53

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

Мой вариант, по-моему намудрил, что скажете :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);

#55
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];
  }
}

#56

Почему не работает сей цикл?

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

Если элемент encodedMessage со смещением превышает длину массива символов
if((encodedMessage[i] + shift) > symbols.length) {

То symbolIndex будет равен разности encodedMessage и symbols.length
var symbolIndex = encodedMessage[(i + shift) - symbols.length];

} else {

Либо же элементу encodedMessage со смещением на shift
symbolIndex = encodedMessage[i + shift];
}

Далее склеивается сообщение из символов.
var symbol = symbols[symbolIndex];
decodedMessage += symbol;
}

Сделал чуть иначе, создав отдельную переменную index, всё заработало, хотя логика та же.

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

decodedMessage += symbol;
}


#57

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

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


#58

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

заодно снова прошел
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” (или какой там, вдруг уже сделали)
все то же самое, но:
значение смещения и/или шифровки многократно превышают длину алфавита


#59

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