тоже понравилось, пришлось подумать немного )) мой вариант, может названия переменных я слишком упростил, мозг был больше занят решением задачи и не стал выдумывать особенные названия ))
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 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;
};
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/
в первом коде: а вторым циклом вы что перебираете (условие выхода из цикла)? а должны перебирать элементы строки 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 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;
смотрите, внешний цикл перебирает числа в интервале от 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);
если хотите, выложите что у вас там неполучилось, поможем советом как поправить.
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;
}