Обсуждение курса «Массивы»
В испытании “Великий дешифровщик” мной был написан следующий код:
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 не отменяет того, что теперь у них область видимости глобальная и я не считаю, что все ваши манипуляции привели к “оптимизации”, вероятно даже наоборот)
Окей, объявление 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];
}
}
Для проверки на чётность используем уже знакомый оператор %.
Если учесть, что его упоминали один раз (и то вскользь), то да о-о-очень знакомый оператор.
Может всё-таки стоит про него в одном из заданий подробно расписать?
Пятая программа: «Начинающий дешифровщик», не работает проверка, если не присвоить значение 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);
}
}