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

Мой вариант с любой длиной года

var getYears = function (yearStart, yearEnd, number) {
  var years = [];
  for (var i=yearStart; i<=yearEnd; i++) {
    var sum = 0;
    var yearLength = String(i).length;
    var year = i;
    for (var j=0; j<yearLength; j++) {
      sum += year%10;
      year = Math.floor(year/10);
    }
    if (sum === number) {
      years.push(i);
    }
  }
  return years
}
Code
function getYears(start, end, number) {
  const rightArr = [];
  
  for (let year = start; year <= end; year++) {    
    const tempArr = year.toString().split('');    
    const sum = tempArr.reduce((acc, cur) => acc + +cur, 0);
    
    if (sum === number) {
      rightArr.push(year);
    }
  }
  
  return rightArr;
}

как-то так)
var getYears = function (startYear, endYear, sum) {
var dates = [];

  for (var i = startYear; i <= endYear; i++) {
      
    var a = String(i)[0];
    var b = String(i)[1];
    var c = String(i)[2];
    var d = String(i)[3];
      
      if (Number(a) + Number(b) + Number(c) + Number(d) === sum) {
        dates.push(i);
      }
    }
    return dates
  }

Посмотрел варианты решения и как понимаю мой вообще неоригинальный вариант, но весьма понятный)

var getYears = function (firstYear, lastYear, sum) {
var arrYears = [];
 for (var year = firstYear; year <= lastYear; year++) {
   var numbersYear = 0;
   for (var i = 0; i < String(year).length; i++ ) {
     var stringYear = String(year);
     numbersYear += Number(stringYear[i]);
   }
   if (numbersYear ===  sum) {
    arrYears.push(Number(stringYear));
   }
 }
 return arrYears;
};

Добавил немного крепкого чая=)

var getYears = function(yearStart, yearEnd, sumOfYear){

  var goodYears= [];
  for (var i=yearStart; i<=yearEnd; i++){
var sum = 0;
var yearStr = i+[];
for(var j=0;j<4;j++){
  sum += +yearStr[j];
  }
if (sum === sumOfYear){
  goodYears.push(i);    
}
  }
return goodYears;  
}

Круто) Мне бы такая простота) Слишком сложно думаю и опыта маловато, из.за этого такие простыни:

let getYears = function (startYear, lastYear, sum){

let olimpicYears = [];
let arrayInput=[];
arrayInput[0]=startYear;

for (let i=0; i<lastYear-startYear; i++){
arrayInput.push(arrayInput[0]++);
if(arrayInput[0]>arrayInput[lastYear-startYear]){
let swap = arrayInput[0];
arrayInput.splice(0,1);
arrayInput.push(swap)
}
}

for(let i=0; i<arrayInput.length; i++){
let numberToString=String(arrayInput[i]);
let numberSum=0;

 for(let j=0; j<numberToString.length; j++){
   numberSum += Number(numberToString[j]); 
  }
 if (numberSum === sum) {
    olimpicYears.push(arrayInput[i])
  }  
}  

return olimpicYears
}

Думал сделать цикл в цикле, но, подумав логически, что целей для олимпийских игр, на ближайшие 10000 лет ставиться не будет, поэтому решил обойтись без второго цикла. Очень похоже на решения других форумчан. Принципиально делаю самостоятельно, без гугления и смотрения в форумы. Уже сравниваю только постфактум, когда задача сделана.
let getYears = function (firstYear, lastYear, sumYearNumbers) {
let targetYears = [];
for (let i = firstYear; i <= lastYear; i++) {
if (Number(String(i)[0]) + Number(String(i)[1]) + Number(String(i)[2]) + Number(String(i)[3]) === sumYearNumbers) {
targetYears.push(i);
};
};
return targetYears
};

Краткое решение с преобразованием к числу с помощью “+”

let getYears = function (firstYear, lastYear, sum) {
let result = []
     for (let i = firstYear; i <= lastYear; i++) { 
     if (+String(i)[0] + +String(i)[1] + +String(i)[2] + +String(i)[3] == sum) { 
     result.push(i)
}
}
    return result
}
1 лайк

Здравствуйте!
Мой вариант:

const getYears = function(yearStart, yearFinish, sum){
const finalYears = [];
while (yearStart <= yearFinish) {
const year = ‘’;
year += yearStart;
var arr = eval(year.split(’’).join(’ + '));
if (sum===arr) {
finalYears.push(yearStart)
}
yearStart++;
}
return finalYears
}

Помогите пожалуйста: почему Timeout error?

let getYears = function (yearStart, yearEnd, yearSum) {
let yearsSort = [];
for (let i = yearStart; yearStart <= yearEnd; i++) {
let yearString = String(i);
let currentSum = Number(yearString[0]) + Number(yearString[1]) + Number(yearString[2]) + Number(yearString[3]);
if (currentSum === yearSum) {
yearsSort.push(i);
}
}
return yearsSort;
}

Добрый день!

У вас в уcловии бесконечный цикл. yearStart всегда меньше, чем yearEnd.

function getYears(yearStart, yearEnd, sum) {
  let result = [];
  for(let i = yearStart; i <= yearEnd; i++) {
    if(String(i).split('').reduce((sum, current) => sum + Number(current), 0) === sum) {
      result.push(i)
      } 
  }
  return result;
}
1 лайк

Вот мой вариант решения, был приятно удивлен, что заработал с первого раза!) Решение через while.

let getYears = function(yearStart, yearEnd, digitSum) {

   let trueYears = []; 
    while(yearStart <= yearEnd) {
      let digitSumYear = 0; 
      let yearStr = String(yearStart);
        for (let i = 0; i <= yearStr.length -1 ; i++) {
        digitSumYear += Number(yearStr[i]);
       }
       if (digitSumYear === digitSum) {
          trueYears.push(yearStart);
         }
        yearStart++;
      }

return trueYears;
}

let getYears = function(startYear, endYear, sumOfNumbersInYear) {
  let years = [];

  for (let i = startYear; i <= endYear; i++) {
    year = i.toString();
    
    if (+year[0] + +year[1] + +year[2] + +year[3] === sumOfNumbersInYear) {
      years.push(i);
    }
  }
  
  return years;
}
2 лайка

Я тут нагородил всего, аж через два массива. Зато всё работает!))))

let getYears = function (yearStart, yearEnd, sum) {
  let arrayString = [];
  let arrayNumbers = [];
  
  for (let i = yearStart; i <= yearEnd; i++) {
    arrayString.push(String(i));
  }

  for (let i = 0; i <= arrayString.length - 1; i++) {
    let year = arrayString[i];
    let yearsum = 0;
    for (let j = 0; j <= year.length - 1; j++) {
      yearsum += Number(year[j]);
      if (yearsum === sum) {
        arrayNumbers.push(Number(year));
        break;
      }
    }  
  }
  return arrayNumbers;
}

getYears(2019, 2030, 5);
1 лайк

Вот, немного похожее решение:

let getYears = function (yearStart, yearEnd, sum) {
  let arrayNumbers = [];
  let line = '';
  
  for (let i = yearStart; i <= yearEnd; i++) {
    line = String(i);
    yearsum = 0;
    for (let j = 0; j <= line.length - 1; j++) {
      yearsum += Number(line[j]);
      if (yearsum === sum) {
        arrayNumbers.push(Number(line));
        break;
      }
    }
  }
  return arrayNumbers;
}

getYears(2019, 2030, 5);

Изначально думал создать доп цикл для суммирования чисел года, но в итоге решил что нет смысла пилить велосипед

Мой вариант решения, добавил комментарии вдруг кому-то пригодится:

 let getYears = function(startYear, endYear, sumOfTheYear) {
      let properYears = [];
    //цикл добавляющий года в массив с последующей проверкой суммы чисел года на соответствие значению sumOfTheYear
      for(i = startYear; i <= endYear; i++) {
        let yearToString = i + '';
        let sumOfTheYearCheck = 
        Number(yearToString[0]) + 
        Number(yearToString[1])+ 
        Number(yearToString[2])+ 
        Number(yearToString[3]);
    // запись в массив properYears
        if (sumOfTheYearCheck === sumOfTheYear) {
          properYears.push(i);
        }
      }return properYears;
    }

Рабочий код, проходит проверку. Только циклы.
let getYears = function (firstYear, endYear, sumOfDigits){
let olympiadYears = [];
for(let i = firstYear; i <= endYear; i++){
let firstYear1 = String(i);
let sumNumbers = 0;
// console.log(sumNumbers);
for (let j = 0; j < firstYear1.length; j++){
sumNumbers += Number(firstYear1[j]);
};
if(sumNumbers == sumOfDigits){
olympiadYears.push(Number(i))
};
};
return olympiadYears;
};

Должно было быть так:
const reducer = (acc, value) => Number(acc) + Number(value);

const culcSumYear = year => {
 const numbers = String(year).split('');

 return numbers.reduce(reducer);
}

let getYears = function (yearStart, endYear, sum) {
  const years = [];
  for (let i = yearStart; i <= endYear; i++) {
    const sumYear = culcSumYear(i);

    if (sumYear === sum) {
      years.push(i);
    }
  }

  return years;
}