Палиндром

Всем, здравствуйте! Подскажите, почему не проходит 3-ю проверку в задании на полидром?
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var str = String(poly);

for (var i = 0, j = str.length - 1; i < str.length; i++, j–) {
if (str[i] == str[j]) {
isPalindrome = true;
}
}

ну потому что скрипт неправильный.
у вас может быть ситуация 12141, где в конечном итоге i и j ссылаются сами на себя и будет возврат true в любом случае (i=2, j = 2).
нужно добавить ветку else и условие выхода из цикла - полудлина строки, т.е.
i < str.length / 2.
также в else ветке должен стоять прерыватель цикла в случае нахождения хоть одного флага false. а еще переменная ylop непонятно за каким существует.

Открывать в случае отчаяния и невозможности разобраться в писанине выше
var poly = 145521;
var isPalindrome = false;
var ylop = String(poly);

for (var i = 0, j = ylop.length - 1; i < ylop.length / 2; i++, j--) {
  if (ylop[i] == ylop[j]) {
    isPalindrome = true;
  } else {
    isPalindrome = false;
	break;
  }
  console.log(`i=${i}, ylop[${i}]=${ylop[i]}, ylop[${j}]=${ylop[j]}, j=${j}`);
}
console.log(isPalindrome);

в решение добавил шаблон, чтобы вы наглядно видели что ваш исправленный скрипт делает поитерационно

Спасибо большое!

а вы не пробовали решать задачи, с использованием пройденного материала?

Вы используете массивы. А задание в теме “циклы”. Мы такое ещё не проходили :frowning:

Я не могу пройти это задание, потому что ничего подобного в разделе “циклы” мы не делали.
Раздел “массивы” это следующий по сложности за “циклами”.

И где в указанном примере есть массивы?

Где там хоть один литерал массива\конструктор Array?

Сводка

image

1 Симпатия

Мой вариант решения. Единственное, что пришлось использовать не из курса - Math.floor - но она там очень нужна, чтобы округлять в нижнюю сторону. Не смог придумать варианта сделать это по-другому.

Сводка

var poly = 57175;
var ylop = 0;
var isPalindrome = false;
var number = poly;
while (number > 0){
ylop = ylop*10 + number%10;
number = Math.floor(number/10);
}
if (ylop == poly){
isPalindrome = true;
console.log(‘Это палиндром!’);
}
else{
isPalindrome = false;
console.log(‘Это не палиндром!’);
}

Изначально имеется 2 варианта решения данной задачи:

  1. Логический (подразумевает только использование возможностей языка программирования доступных на основе пройденных лекций).
  2. Математический (подразумевает использование математических вычислений и возможностей языка программирования на основе пройденных лекций).

Разберем первый вариант. Если отбросить тот факт, что мы делаем задание на курсе “Циклы” и вспомнить, что мы проходили ранее преобразование в строку или в число, то этот вариант решит задачу, т.к. никто не запрещает использование ранее полученных навыков:

while (poly % 10 > 0 && copyPoly / 10 > 0) {
  ylop += copyPoly % 10;
  copyPoly = (copyPoly - (copyPoly % 10)) / 10;
}

if (parseInt(ylop) === poly) {
  isPalindrome = true;
}

Достаточно ylop превратить в строку и добавлять каждый символ из poly посимвольно.

Я не рекоммендую данный способ, т.к. он нарушает изначальные правила решения задания, а именно:

  1. Переменная ylop - должна быть числовой переменной.
  2. Курс не про строки

Чуть позже опубликую второй вариант решения данного задания (математический).

Как и обещал, публикую свой вариант второй версии решения задачи. Заранее скажу, что в данном варианте нет запрещенных методов вроде:

  1. Использование строк.

  2. Использование/Создание каких либо переменных, отличных от имеющихся изначально.

  3. Использование каких-либо математических функций (Math.*).

         var poly = 1221;
         var ylop = 0;
         var isPalindrome = false;
    
         for (var i = poly; i > 0; i = (i - (i % 10)) / 10) {
           ylop += i % 10;
           if (i - (i % 10) > 0) {
             ylop *= 10;
           }
         }
    
     if (ylop === poly) {
       isPalindrome = true;
     }
    

Что же здесь происходит? Объясню. Так как я посчитал заведение лишней переменной за нарушение правил решения задачи, я решил использовать только доступную для for(;:wink: переменную i. Так как любая операция с переменной poly будет менять её значение, я присвоил переменной i значение переменной poly.

Не забывайте, что переменная poly нам необходима в конце, для сравнения строк и определения, является ли число палиндромом, так что не меняйте содержимое переменной poly, а используйте копию poly, например i

В каждом проходе цикла for я уменьшаю значение переменной i таким образом, чтобы каждый раз убирался последний символ. Как мы знаем i % 10 вернет остаток от деления. Каждый раз, мы от предыдущего значения i вычитаем остаток от деления i на 10, и делим полученный результат на 10, чтобы убрать ноль в конце числа.

В то же время мы увеличиваем переменную ylop на это самое значение остатка от деления на 10 (т.е. последний символ). После увеличения проверяем, изначальное число больше ноля, при вычитании от него остатка от деления? Пример:

1234 // Каждый проход цикла будет делать i = (i - (i % 10)) / 10, т.е. (1234 - (1234 % 10)) / 10 = 123, каждый раз отсекая последнее число. В проверке if () мы сначала от 1234 отнимаем последний символ, но не делим число на 10, чтобы осталось 1230. Таким образом мы определяем как управлять переменной ylop, добавлять ей значение или добавлять разряд в виде ноля. Последовательность изменения переменной ylop:

0 // Начало
1 // Добавили последнюю цифру от 1221. 
10 // Добавили разряд, так как понимаем что 1220 больше 10ти
12 // Добавили последнюю цифру от 122
120 // Добавили разряд, так как понимаем что 120 больше 10ти
122 // Добавили последнюю цифру от 12
1220 // Добавили разряд, так как понимаем что 12 больше 10ти
1221 // Добавили то что осталось, так как оно меньше 10