Массивы

Обсуждение курса «Массивы»

В испытании “Великий дешифровщик” мной был написан следующий код:

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

Исправно работал, но проблема была в том, что при прохождении тестов под каждым из них выводилась надпись: - “переменная i не определена” и тест не засчитывался. Изменив её объявление с let на var, а затем проделав тоже самое и с переменной nextChar - тесты перестали ругаться и всё выполнилось успешно. Может стоит пофиксить?

P.S. На процесс выполнения конечно же никак негативно не влияло, ибо конфликтов с областью видимости не возникало, разве что только при проверке тестами к этому заданию)

Немножко оптимизировал:

let symbolsLength = symbols.length;
let nextChar;

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

А в чем заключается оптимизация если не секрет?) Вы добавили 2 переменные с глобальной областью видимости, объявив их извне цикла, да и заняли на строку больше. В таком случае воспользовались бы тернарным оператором в цикле, но того факта, что переменные вынесены за пределы цикла и объявлены через let не отменяет того, что теперь у них область видимости глобальная и я не считаю, что все ваши манипуляции привели к “оптимизации”, вероятно даже наоборот)

1 лайк

Окей, объявление nextChar действительно стоило оставить внутри цикла. Вы правы.

let symbolsLength = symbols.length; мне стоило тоже объявить внутри for().

Бесспорно только то, что у вас дублировалась строчка decodedMessage += symbols[nextChar];.

Да, тут с вами согласен.

Скажите пожалуйста в чём моя ошибка, дешифровка идёт, а вот Ваше значение decodedMessage не проходит проверку. : “Незваный пылесос хуже веника” не совпадает с ожидаемым значением (ожидаемое значение скрыто).

code

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

1 лайк

Для проверки на чётность используем уже знакомый оператор %.

Если учесть, что его упоминали один раз (и то вскользь), то да о-о-очень знакомый оператор.
Может всё-таки стоит про него в одном из заданий подробно расписать?

Пятая программа: «Начинающий дешифровщик», не работает проверка, если не присвоить значение i-переменной в цикле. Браузер Chrome 68.0.3440.84.

Сначала я совершил ошибку и не присвоил переменной-счетчику значение - думал, что не работает проверка вообще. Возможно, стоит “научить” автоматическую проверку реагировать на отсутствие значения в i.

а что Вам мешает использовать console.log(i) для самостоятельной проверки?

В задании “Аналитика пользователей” , в разделе теория есть опечатка.

var string = ‘Меня зовут Кекс’;
// Записываем строку в переменную

// Ищем самый первый элемент в строке
console.log(string[0]);
// Вернёт ‘М’

// Ищем шестой элемент в строке
console.log(string[6]);
// Вернёт ‘з’

Шестой элемент = “о” , а не "з"

decodedMessage = ‘’;
for (let i = 0; i < encodedMessage.length; i++) {
m = encodedMessage[i];
decodedMessage += symbols[m];
if (decodedMessage.length == encodedMessage.length) {
console.log(decodedMessage);
}
}