Палиндром


#1

Почему подобная конструкция не проходит проверку?
Подскажите, в чем ошибка.

var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var biba = 0;


while (isPalindrome = false) {
    biba = poly % 10;
    ylop = Math.round(poly / 10) + biba.toString();
    if (ylop == poly) {
        isPalindrome = true;
    } else {
        break;
    }
}

#2

а почему она вообще должна проходить проверку? =)

  1. синтаксическая ошибка, условие цикла должно возвращать булево значение, у вас стоит присваивание. соотвественно где счетчик для изменения или хоть что-то? цикл не имеет смысла вообще.
  2. рассмотрим число 1234 в илоп идет 123 + “4” будет “1234”. 1234 == “1234” ( true ). это по-вашему палиндром?
  3. рассмотрим число 123456, в Math.round(12345.6) будет 12346, т.е. уже искажение. Вам тут нужно применять метод parseInt() или метод округления вниз (это когда поправите логику 2 пункта).
Спойлер - решил за вас. Открывать только в случае отчаяния
var poly = 1221;
var ylop = 0;
var isPalindrome = false;

var biba = 0;
var boba = poly;

while (boba > 0) {
    biba = boba % 10;
    ylop += biba.toString();
    boba = Math.floor(boba / 10);
}
if (ylop == poly) { isPalindrome = true; }

#3

Ваше решение выдает правильное решение.
Но сколько не пытался разобрать его на тетрадке ничего абсолютно разобрать не могу и не могу понять логику.


#4

какая именно строка не понятна?


#5

Все три действия в While. Не понятно что за что отвечает и каким образом. Либо скрипт не для меня, в HTML и CSS быстро разобрался, а тут урок по два дня разбираю. И без помощи только 2 доп задания в циклах смог сделать.


#6

ну сразу скажу, что я бы так не стал решать, лишь поправил скрипт топикстартера

значит так:
у нас есть переменная БОБА что является клоном “поли”. почему не сама поли? ну нам надо произвести некоторые операции над ней, а потом сравнить с эталоном. поэтому саму поли не трогаем, а работаем с её клоном.

в бибу пишем целочисленный остаток от деления “клона поли” на 10 на каждой итерации (1 строка цикла). при этом клон поли делится на 10 на каждой итерации и дробная часть отсекается округлением вниз и потом клон поли перезаписывается (3 строка цикла).

в результате на каждой итерации мы берем остаток от деления на 10 и делаем из него строку с помощью метода для представления строк .toString() (можно было бы с тем же успехом складывать с пустой строкой - конкатенация строк сделала бы эту цифру строкой). И складываем уже с полученным из предыдущей итерации “илоп”.
ylop += biba.toString(); можно развернуть как ylop = ylop + biba.toString();

Рассмотрим на собачках примере из псевдокода:

поли = 1221, значит боба = 1221
илоп = 0 (с тем же успехом он бы мог быть пустой строкой "" )

пока (боба > 0) {
1221 > 0 (истина)
1 итерация:
остаток от деления = 1221 % 10 = (1220 + 1) % 10 => 1 в остатке
илоп = илоп + “1” = 0 + “1” = “01”;
боба = округлить_вниз( 1221 / 10) = округлить_вниз ( 122.1 ) = 122;
=====конец 1 итерации =====

122 > 0 (истина)
2 итерация:
остаток от деления = 122 % 10 = (120 + 2) % 10 => 2 в остатке
илоп = илоп + “2” = “01” + “2” = “012”;
боба = округлить_вниз( 122 / 10 ) = округлить_вниз ( 12.2 ) = 12;
=====конец 2 итерации =====

12 > 0 (истина)
3 итерация:
остаток от деления = 12 % 10 = (10 + 2) % 10 => 2 в остатке
илоп = илоп + “2” = “012” + “2” = “0122”;
боба = округлить_вниз( 12 / 10 ) = округлить_вниз ( 1.2 ) = 1;
=====конец 3 итерации =====

1 > 0 (истина)
4 итерация:
остаток от деления = 1 % 10 = единица меньше делителя, значит она и есть остаток => 1 в остатке
илоп = илоп + “1” = “0122” + “1” = “01221”;
боба = округлить_вниз( 1 / 10 ) = округлить_вниз ( 0.1 ) = 0;
=====конец 4 итерации =====

1 > 0 (ложь)
=====КОНЕЦ ЦИКЛА=====

итоги:
илоп = “01221”;
биба = 1;
боба = 0;

если ( “01221” == 1221 ) { isPalindrome = истина }
1221 = 1221 (истина)
значит это палиндром


#7

Огромное спасибо, Кирилл. Вроде понятнее стало. Не правильно понял логику работы оператора “%”. Теперь вроде все всталона свои места)))
Завтра снова разберу повнимательнее.