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


#1

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

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

#2

Похоже, но сумма цифр через цикл.

Код
var getYears = function (firstYear, lastYear, sumNumbers) {
  var goodYears = [];
  for (var i = firstYear; i <= lastYear; i++) {
    var arrYear = i.toString().split('');
    var sum = 0;
    for(var j = 0; j < arrYear.length; j++) {
      sum += Number(arrYear[j]);
    }
    if (sum === sumNumbers) {
      goodYears.push(i);
    }
  }
  return goodYears;
};

#3
Решение

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


#4

Сделал похожим образом. Режет глаза ваше 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/


#5

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


#6
мое решение, через 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;
}


#7

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


#8

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


Олимпиада для котов - Решение
#9

Объясните пожалуйста
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;
}


#10

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


#11

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

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

#12

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


#13

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

Вот что получилось (длинновато, правда :-) ):
  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;
 }

#14

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

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;

#15

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


#16

смотрите, внешний цикл перебирает числа в интервале от 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);

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


#17

Спасибо!


#18
Вариант
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;
}

#19

Решение с вычислением разрядов:
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;
}