Олимпиада для котов


#21

Вроде работает. Кто-нибудь из гуру гляньте пжл. Может можно оптимизировать?

Сводка

var getYears = function (yearBegin, yearEnd, sum) {
var array = [];
for (i=yearBegin; i<=yearEnd; i++) { //Перебираем годы
var year = String(i); //Переводим год из числа в строку
var sumOfDigits = 0; //Задаём переменную, где будем складывать цифры из года
for (j=0; j<=year.length-1; j++) { //Перепираем каждую цифру в году
sumOfDigits+=parseInt(year[j], 10);//Суммируем цифры в году
}
if (sumOfDigits == sum) {//Сравниваем сумму цифр в году с sum
array.push(i);//Если они равны, то добавляем этот год в массив
}
}
return array;
}


#22

смотря что под оптимизацией имеется ввиду.
из того что преподают в курсах уже нормально.


#24

Товарищи, помогите, пожалуйста, разобраться.

В первом сообщении Roman1 привел свое решение:

var getYears = function (year, yearEnd, sumYear) {
  var olymp = [];
  for (i = year; i <= yearEnd; i++) {
    var yearStr = String(i);
    var sumYe = Number(yearStr[0]) + Number(yearStr[1]) + Number(yearStr[2]) + Number(yearStr[3]);
    if (sumYe === sumYear) {
      olymp.push(i);
    }
  }
  return olymp;
}

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

var yearStr = String(i);
var sumYe = Number(yearStr[0]) + Number(yearStr[1]) + Number(yearStr[2]) + Number(yearStr[3]);

Буду признателен, если кто-нибудь растолкует подробно.


#25

Пусть будет число 1234
var yearStr = String(i); // "1234" строка

Преобразование типа данных к строке
А строку уже можно рассматривать как массив (ну вот работает так строка как неразбитый массив, имеет некоторые схожие методы), взяв от нее N - элемент
Мы живем в третьем тысячелетии, поэтому нас интересуют четырехзначные цифры-строки (Император Человечества негодуэ, т.к. эту прогу не использовать в 40к году).

yearStr[0] + yearStr[1] + yearStr[2] + yearStr[3] // "1" + "2" + "3" + "4"

И теперь берем 0, 1, 2, 3 элемент числа-строки и складываем. А чтобы не произошла конкатенация строк, приведем взятые числа-строки к числам

Number( элемент_числа-строки ) // 1 + 2 + 3 + 4


#27

Hierumo, спасибо за ответ.
Логику преобразования (из строк в числа) понял.

Только я не понял зачем было вообще приводить данные — начальный и конечный годы к строке. Они же изначально приходят нам в виде чисел, — зачем нужна операция приведения числа к строке на первом шаге? Без нее никак никак не получится решить задачу?


#28

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


#29

ясно, спасибо за разъяснение!


#30

Пришел к такому решению.

var getYears = function (startYear, endYear, digit) {

var period = [startYear]; // создаем массив, сразу помещаем в него начальный год
for (i = 0; period[period.length - 1] < endYear; i++) { // наполняем массив пока не достигнем значения аргумента endYear
  period.push(period[i] + 1);
}

var currentYear; // создаем отдельную переменную для работы с каждым из элементов
var resultYears = []; // создаем массив, в который сохранятся подходящие значения

for (n = 0; n <= period.length - 1; n++) { // перебираем развернутый массив period
  currentYear = String(period[n]); // каждый элемент переводим в строку
  var sum = 0; // назначаем переменную для подсчета суммы в элементе
  for (j = 0; j <= currentYear.length - 1; j++) { // перебираем строку как массив
    sum += Number(currentYear[j]); // каждый символ приводим к числу и складываем
    }
  if (sum === digit) { // проверяем, совпадает ли сумма с аргументом digit
    resultYears.push(period[n]); // если да - отправляем в итоговый массив
    }
}
return resultYears; // возвращаем массив найденных годов как результат функции getYears
}

#31

Решение без перевода числа в строку и обратно, только на циклах.
Использование перевода, мне кажется, утяжеляет код.
Ну и этот вариант универсален - мало ли где будет Кекс в 40к году )

var getYears = function(year1, year2, num) {
var newArray = [];
while(year1 <= year2) {
var sum = 0;
for (var i = year1; i > 0; i = parseInt(i/10)) {
var n = i % 10;
sum += n;
}
if (sum == num) {
newArray.push(year1);
}
year1++;
}
return newArray;
}


#32
var getYears = function(firstY, lastY, numb) {
var olimp = [];
for (var i = firstY; i <= lastY; i++) {
 var sum = 0;
 var yearStr = String(i);
 for (var j = 0; j < yearStr.length; j++) {
  sum += Number(yearStr[j]); 
  }
  if(sum === numb) {
     olimp.push(i);
  }
}
 return olimp;
}

Такое вот решение получилось.