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

Решение

let getYears = function(start, end, amountNumbers) {
let years = [];
let bestYears = [];
// Создание массива с годами периода и перевод элементов массива в строку
for (let i = start; i <= end; i++) {
years.push(String(i));
}
// Обращение к i-тому элементу массива
for (let i = 0; i < years.length; i++) {
let oneYear = years[i];
let result = 0;
// Рассчёт суммы цифр i-того элемента
for (let j = 0; j < oneYear.length; j++) {
result += Number(oneYear[j]);
}
// Создание массива подходящих лет
if (result === amountNumbers) {
bestYears.push(Number(oneYear));
}
}
return bestYears;
};

Сделал похожим образом. Режет глаза ваше Number во вложенном цикле =)

моё рабочее
var getYears = function (start, final, summa) {
  var olympYears = [];
  for (var i = start; i <= final; i++) {
    var yearsArray = i+[];
    var sum = 0;
    for (var j = 0; j < yearsArray.length; j++) {
      sum += +(yearsArray[j]);
    }
    if (sum === summa) {
      olympYears.push(i);
    }
  }
  return olympYears;
};

На форуме нашел у кого-то решение с приведением к числу без методов, которое в курсе не преподавалось еще, заодно нашел статью про обфускацию в JS на Хабре: https://habr.com/post/312172/

2 лайка

Вроде норм) Плюс конечно изящнее выглядит, соглашусь, но смысл тот же.

мое решение, через while

var sumYearArray = [];
var getYears = function (startYear, endYear, sumYear){
while (startYear <= endYear){
var strNum = String(startYear);
var sum = parseInt(strNum[0], 10) + parseInt(strNum[1], 10) + parseInt(strNum[2], 10) + parseInt(strNum[3], 10);
startYear++;
if(sum === sumYear){
sumYearArray.push(startYear -1);
}
}
return sumYearArray;
}

а если сей код понадобится в 40к году? =)
Вдруг Кекс будет Императором Человечества?

Это намёк @Hierumo на расчет суммы цифр года с помощью цикла.

Объясните пожалуйста
var sum = 0;
var years = [];
var getYears = function (year1, year2, number) {
for(var i = year1; i <= year2; i++) {
var yearStr = String(i);
for(var j = 0; j < year2.length; j++){
sum += Number(yearStr[j]);
}
if(sum == number) {
years.push(i);
}
}
return years;
}

почему этот код не прибавляет в sum, а этот без второго цикла работает нормально? объясните пожалуйста

var sum = 0;
var years = [];
var getYears = function (year1, year2, number) {
for(var i = year1; i <= year2; i++) {
var yearStr = String(i);

  sum = Number(yearStr[0]) + Number(yearStr[1]) +Number(yearStr[2]) + Number(yearStr[3]);
if(sum == number) {
  years.push(i);
}

}
return years;
}

в первом коде: а вторым циклом вы что перебираете (условие выхода из цикла)? а должны перебирать элементы строки yearStr.
второй код не имеет второго цикла по причине полового бессилия кодера: не 4х-значные годы он обработать не сможет, либо обработает с ошибкой

Решил все реализовав расчет суммы через дополнительную функцию. Как вам такой вариант?

var getSum=function (year){
  var sum=0;
    for (var i=1;i<=4;i++){
      sum+=year%10;
      year=Math.floor(year/10); 
    }
    return sum;
  }
var getYears=function (startYear,endYear,sumDays){
  var dates=[];
  for (var i=startYear; i<=endYear;i++){
      if (getSum(i)==sumDays) {dates.push(i)};
    }
    return dates; 
}

я б немного поработал над этим:
var i=1; i<=4;i++

Попробовал решить через остаток от деления.

Вот что получилось (длинновато, правда :-) ):
  var getYears = function (startYear, 
        endYear, digAmount) {
  var olimpicYears = [];
  while (startYear <= endYear) {
  var sum = 0;
  var year = startYear;
  while ((year/10)>1) {
  sum += year%10;
  year = Math.floor(year/10);
 }
 sum += year;
 if (sum == digAmount) {
olimpicYears.push(startYear);
 }
 startYear++;
 }
 return olimpicYears;
 }

Всем привет.
Вот что получилось:

var getYears = function (firstYear, lastYear, desiredYear) {
  var olimpYears = [];
  for (var i = firstYear; i <= lastYear; i ++) {
    var yearString =String(i); 
    var yearSum = 0;
    for (var j = 0; j < 4; j++) {
      yearSum += Number(yearString[j]);      
    }
    if (yearSum === desiredYear) {
      olimpYears.push(i);  
    }
  }
  return olimpYears;

Разве условием выхода не является " j < year2.length;" ? У меня такая же ситуация - перебираю цифры года и пытаюсь сложить, а не складывает.

смотрите, внешний цикл перебирает числа в интервале от year1 до year2 включительно. с этим разобрались.
теперь берем конкретное число из этого списка.
нам надо перебрать его позиции и сложить значения каждой позиции. пусть число 1234 становится “как бы массивом” [1, 2, 3, 4]. и его мы перебираем используя метод .length (да-да, не удивляйтесь, об этом не принято говорить, но строка является как бы “склееным массивом”). а чтобы число 1234 стало строкой (читай “массив”), надо его привести, используя либо String(1234), либо чуть более изящно 1234+[] (кстати тут явно видно, что число стремится стать “массивом” и становится строкой).

для любопытных

можно извратиться еще больше и натурально сделать массив из числа, как это сделала Ineska:
var arrYear = i.toString().split(''); и уже массив перебрать и получить сумму его элементов

а перебирая year2.length вы перебираете число. причем не рандомное из списка, а из ввода. а метод .length к нему не применим. ну если конечно при вызове функции вы конечно не зачитерите так: getYears(“1234”, “2345”, 12);

если хотите, выложите что у вас там неполучилось, поможем советом как поправить.

2 лайка

Спасибо!

Вариант
var getYears = function (x, y, z) {
  var mass = [];
  for (var i = x; i <= y; i++) {
    var summ = 0;
    for (var j = 0; j < i.toString().length; j++) {
      var h = i.toString();
      summ += parseInt(h[j], 10);
    }
    if (summ === z) {
      mass.push(i);
    }
  }
  return mass;
}

Решение с вычислением разрядов:
function getYears (startYear, endYear, value) {
var arr = [];

for (var i = startYear; i <= endYear; i++) {
if (getSumOfDigits (i) == value) {
arr.push(i);
}
}
return arr;
}

function getSumOfDigits (year) {
var n = year;
var sum = 0;

do {
sum += n - Math.floor(n / 10) * 10;
n = Math.floor(n / 10);
} while (n > 0);
return sum;
}

Не подскажет в чем ошибка . С моей стороны кажется что 2 кода идентичны по исполнению , однако 1-ый не проходит проверку…

var getYears = function(firstYear, lastYear, number) {
var year = [];

for ( var i = firstYear; i <= lastYear; i++) {
var sum = 0;

while (i > 0) {
sum += i%10;
i = Math.floor(i/10);
}

if (sum === number) {
year.push(i);
}

}
return year;
}
а второй проходит

var getYears = function(firstYear, lastYear, number) {

var array = [];

var first = Number(firstYear);
var last = Number(lastYear);

for ( var i = first; i<=last; i++) {
var b = i;
var sum = 0 ;

  while (b > 0) {
  sum += b %10; 
  b =  Math.floor(b /10 ); 
  }
  if  (sum === number) {
    
     
    array.push(i);
     }
}

return array;
}

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

Сводка

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;
}

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