Палиндром


#63

по сложному пути пошли. вам не нужно искать разрядность числа.
вам нужна просто 1 временная переменная и нестрогое сравнение, чтобы сравнить 2 числа).

var poly = 50205;
var ylop = ""; // изменим тут, ниже поймете зачем
var isPalindrome = false;
var temp = poly;
for (var i = 0; temp > 0; i++) { // i тут тупо счетчик, условие выхода, что число больше не сосчитать по разрядам (т.е. по итерациям цикла)
  ylop += (temp % 10); // число + любая строка = строка
  temp = parseInt(temp/10, 10); // parseInt тащем-та работает не просто как преобразователь к числу. если это число дробное, оно его еще и обрезает до целого вниз. Math.floor (округление) вы изучите в следующей главе.
  console.log(`${i} итерация: temp = ${temp}, ylop = ${ylop} (${typeof(ylop)})`); // вы шаблоны не пройдете в курсах от академии, добавил, чтобы вам наглядно было что происходит на каждой итерации цикла, а заодно видели тип данных, не обязательная строка в общем-то
} 
if (poly == ylop) { isPalindrome = true; } // почему не строгое? ну влом приводить к числу, нам же не важен тип данных =) 

Помните, что прибавляя даже пустую строку вы меняете тип данных на строковый. а это как раз и надо, чтобы дописывать в конец строки остаток от деления на 10.
И заметьте, нет ничего такого, что вы не изучали.

вообще без доп. переменных
var poly = 50205;
var ylop = "";
var isPalindrome = false;

for (var i = poly; i > 0; i = parseInt(i/10, 10)) { 
  ylop += (i % 10); 
  console.log(`i = ${i}, ylop = ${ylop} (${typeof(ylop)})`);
} 
if (poly == ylop) { isPalindrome = true; }

#64

var poly = 121;
var ylop = 0;
var isPalindrome = false;
var number = poly;

while (number > 0) {
ylop = ylop * 10 + (number % 10);
number = (number - (number % 10)) / 10;
}

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


#65

нечего сказать, круто)
Благодарю!
Мои решения пока прямолинейные, потому как начинающий, пока осваиваю основы, твой способ намного упрощённый в плане кода (нет лишних переменных, а сама суть поместилась в 2-х строчках). Я запомнил свои ошибки.


#66

Объясните, пожалуйста, почему не происходит математического сложения чисел при действии ylop+= i % 10;, почему они записываются рядом, а не складываются?
Спасибо.


#67

непонятный код целиком приложите


#68

Вопрос вот по этому решению. Спасибо.


#69

давайте чутка модифицируем код, чтобы поиграться? :stuck_out_tongue_winking_eye:

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

for (var i = poly; i > 0; i /= 10) {
  schetchik++;
  ylop += i % 10;
  console.log(`начало итерации №${schetchik} ylop=${ylop}`);
  if (i >= 10) {
    ylop *= 10;
  }
  i -= i % 10;
  console.log(`конец итерации №${schetchik} ylop=${ylop}`);
}

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

вставьте код в консоль и поймете, что все хорошо складывается


#70

Благодарю, наглядно, понятно, спасибо!:smile_cat:


#71

В конце пошли решения, встречаются ещё более менее понятные. А в начале почитаешь, команды в решениях с Math.floor с Math.pow, мы ещё это не проходили, для начинающего очень сложно понять, приходилось искать сайт шпаргалку, чтобы вычитывать что это за команды. Думаю что нужно бы в курсах в теории вначале с этими командами ознакомить всё таки и дать расшифровку, как в начале в знакомстве в html знакомили с каждым тегом.
Как то в первых главах было всё по полочкам, разъясняли каждую деталь, а в Javosript не так подробно объясняется.


#72

Приветствую.
Данную задачу решил так:

var poly = 5005; var ylop = 5005; var isPalindrome = false;

var y = 0;

while(ylop!==0){
y = y*10 + ylop%10;
ylop = Math.floor(ylop/10);
}

if(y===poly){
isPalindrome = true;
}else{
isPalindrome = false;
}


При проверке на htmlAcademy почему-то isPalindrome=false при poly=5005…
Хотя сам считал на бумажке проходя каждый цикл - получается true. То есть в моем случае при выходе из цикла y=poly.
Также и в онлайн-компиляторе Javascript (https://playcode.io/online-javascript-editor), куда я вставил свой код, переменная isPalindrome=true при poly=5005 и ylop=5005.

Хотелось бы узнать почему в Академии тест не проходит с числом 5005?


#73

у вас переменные неверно объявлены. ylop должно быть равно poly.
вообще предполагалось, что буферная переменная равная poly будет y, а в ylop вы будете записывать то, что будете в условии сравнивать.
также в условии не нужно писать else ветку, если вы описываете дефолтное состояние isPalindrome = false


#74

Спасибо за подсказку насчет ветки условия - действительно, оно лишнее.

Исправил код вот так:

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

var y = poly;
while(poly!==0){
ylop = ylop*10 + poly%10;
poly = Math.floor(poly/10);
}

if(ylop===y){
isPalindrome = true;
}

После этого все тесты прошли.
Правда и первая версия программы работала)


#75

Работала, только неправильно. Для непалиндромов и 5005. А надо для всех значений. Исправили тоже неправильно. Теперь вы потеряли исходную переменную и от фиаско вас держит только ссылка в буфере


#76

Переменную y использую для хранения исходного значения переменной poly, .так как саму poly в цикле разбираю до 0. Как тогда сравнивать то что собралось в ylop с исходным числом?

Можете пояснить пожалуйста почему при каких-то значениях код не сработает? я проверял для нескольких в компиляторе - работает.
Спасибо.


#77

вот почему:

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

var poly = 10101;
var ylop = 0;
var isPalindrome = false;
var buffer = poly;
while (buffer !== 0) {
  ylop = ylop * 10 + buffer % 10;
  buffer = Math.floor(buffer / 10);
}

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

#78

Все понял. Спасибо за разъяснение


#79

Есть такой вариант рабочий, но только для 4х значных чисел :slight_smile:

var poly = 4554;
var ylop = 0;
var isPalindrome = false;

var one
one=poly%10
var one1
one1=one*1000
console.log(one1)

var two
two=(poly-one)%100
var two2
two2=two*10
console.log(two2)

var three
three=(poly-one-two)%1000
var three3
three3=three/10
console.log(three3)

var four
four=(poly-one-two-three)%10000
var four1
four4=four/1000
console.log(four4)

ylop=one1+two2+three3+four4

if (poly===ylop){
isPalindrome=true}else{
isPalindrome=false}


#80

это вообще не вариант, у вас тема называется “циклы”


#82

абсолютно неправильное решение, просто обошли проверку. неправильно тут все от начала и до конца. работает с любыми проверками, где не палиндромы заканчиваются на единицу и палиндромы заканчиваются на не единицу. на палиндром они естественно не проверяются.
вопрос тот же, что и к предыдущему - где цикл?


#83

Всем привет! Задание далось оооочень непросто. Прочитала ВСЕ, на текущий момент, варианты решения. Огромное всем спасибо, т.к. без вас я бы в принципе не поняла что нужно делать. Суммировав все, получился вот такой вариант:

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

if (poly === ylop) {
    isPalindrome = true;
} else {
  isPalindrome = false;
  }

console.log(isPalindrome);

Вариант рабочий, проверки прошел. Про безопасные числа оч интересно, спасибо @yshmatlay.
Буду рада критике/комментариям.