Массивы


#1

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


#2

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

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. На процесс выполнения конечно же никак негативно не влияло, ибо конфликтов с областью видимости не возникало, разве что только при проверке тестами к этому заданию)


#3

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

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

#4

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


#5

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

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

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


#6

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


#7

Скажите пожалуйста в чём моя ошибка, дешифровка идёт, а вот Ваше значение 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];
}
}


#9

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

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


#10

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

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