Достаточно

Это круто, надо будет пошагово разобрать. Вот мне трудно выстраивать такие “абстрактные” цепочки, обычно получаются либо простяцкие решения “в лоб”, либо малопонятная нелогичная хрень.

а я объясню сразу, чтобы легче было понимать:

подзадачи:

  1. создать новый массив calories.map(...), в котором элементы будут суммой каждых предыдущих элементов массива с калориями. т.е. длины этих массивов будут равны между собой.
    а) item = calories.slice(0, i + 1) // берем “подмассивы” длиной от 1го элемента до i+1, т.е. первый подмассив будет длиной 1, второй 2, третий 3 и так далее.
    б) находим сумму членов таких “подмассивов” .reduce((a, b) => a + b, 0)
    в) записываем в наш новый безымянный массив каждую такую сумму из (1б)
  2. фильтруем наш массив так, чтобы отрезать его кончик, который будет больше лимита (это безопасно, т.к. мы точно знаем что каждый следующий элемент массива больше предыдущего) .filter(item => item <= limit)
  3. находим длину отфильтрованного, это и есть ответ .length

чтобы было вообще нечитабельно, надо поменять названия переменных на a,b,c,d… (не учитывая коллбеки)
так сказать “вредные советы” in da thread

1 Симпатия

Хвались, как дошел до такой жизни? Конкретно на этом примере.
Шел от обратного или внутренний злой гений?

ну учили всегда разбивать задачу на подзадачи, подумал как можно “быстро” найти итератор, не выделяя его в отдельную переменную (потому что хочу использовать стрелочную функцию, чтобы в 1 строчку все было азаза). потому циклы отбросил сразу (т.к. там минимум 1 итератор надо создавать).
поэтому итератором стало свойство объекта массива - length. значит нам надо сделать новый массив.
длина этого массива должна быть ограничена таким последним максимально большим элементом, который меньше или равен лимиту.
а значит нам надо найти суммы.
ну получается что от обратного, да. практического смысла это не имеет, т.к. эта программа тяжелее обычного цикла с инкрементом, но в плане понимания методов перебирания массива очень ОК (а еще я практикуюсь пока авторы курсов не добавляют новые задачи)

1 Симпатия

.filter(item => item <= limit)
Жутко красивый фрагмент, вот есть в нем что-то такое… загадочное, притягательное :smile:

Я бы между стрелками запихнул текст “купи! всего 0,99 центов” :laughing:

я вот так сделал
var getDiet = function (dinner, kallories){
var sum = 0;
for (var i = 0; i < dinner.length; i++){
sum += dinner[i];
if (sum > kallories) break;
}
return i
}

хорошее решение - но достаточно трудоемкое по ресурсам и времени выполнения

эт как раз было из разряда “вредных советов” Григория Остера
простой цикл на while тут будет оптимальнее всего (на данный момент).

я останусь верным себе)))

через reduce и кортеж - только данные в нем изменяются
function getDiet(calories, limit) {
  return calories.reduce((acc, item, step) => {
    const currentCount = acc[0];
    const currentCalories = acc[1];

    if (currentCalories + item <= limit && step === currentCount) {
      acc[0] = currentCount + 1;
      acc[1] = currentCalories + item;
    }

    return acc;
  }, [0, 0])[0];
}

getDiet([1, 2, 3, 2], 5);

/// хотя у andreas - хорошо решение!)

Такого вроде не было

var getDiet = function (food, limit) {
  for (var i = 0, j = 0; i + food[j] <= limit; i+= food[j], j++) {}
  return j;
}
2 Симпатий

У меня такое решение вышло:
var getDiet = function(calories, limit) {
for(var i = 0; i < calories.length; i++) {
if(limit >= calories[i]) {
limit-= calories[i];
} else {return i};
}
};

Мой вариант через reduce :)

let getDiet = (calorios, limit, arr=[]) =>{
calorios.reduce((a,b,i)=>(a+b>limit)?arr.push(i):a+b);
return arr[0]}

моё решение:

var getDiet = function (callories, limCallories) {
var limit = callories.length - 1;
var numberDishes = 0;
for (var i = 0; i <= limit; i++) {
numberDishes += callories[i];
if (numberDishes > limCallories) {
limit = i;
}
}
return i - 1;
}

Без условий. И без “-1”.
var getDiet = function(calories, limitCaloriesDays) {
var sumCalories = 0;
var total = 0;
for (var i = 0; sumCalories + calories[i] <= limitCaloriesDays; i++) {
sumCalories += calories[i];
total++;
}
return total;
}

var totalCalories = 0;
var limitArr = [];

var getDiet = function(calories, limit) {
for (var i = 0; i <= calories.length - 1; i++) {
if(totalCalories + calories[i] <= limit){
totalCalories += calories[i];
limitArr.push(calories[i]);} else {
break}
}
return limitArr.length;
}

 var getDiet = function (call,minCall) {
  var sumCall = 0;
  for (var i = 0; i <= call.length - 1; i++) {
    console.log(i);
  if (sumCall < minCall) {
      sumCall += call[i];
       console.log(sumCall);
    }else{
      if (sumCall > minCall) {
        i--;
        return i
        }
       return i;
      }
  }
  }

@Hierumo как всегда элегантно)) :+1:t2:

Бессовестно стащила))) и переделала с циклом for:

Сводка
const getDiet = (calories, limit) => {
    for (let i = 0; calories[i] <= limit; i++) {
        limit -= calories[i];
    }
    return i;
};

Все плохо?

var sum = 0;
var dishes = 0;

function getDiet(calories, limit) {
  for (var i = 0; i < calories.length; i++) {
    var index = calories[i];
    sum = sum + index;
    if (sum > limit) {
       return dishes
    } else if (sum === limit) {
      dishes = dishes + 1  
    } else {
      dishes = dishes + 1
    }
  }
 
}

Подскажите, насколько это хороший код? Например, насколько он читаемый? Это плохо или слишком плохо?) Знаю, что можно было обойтись без второго условия, как в первом комменте, но мне мой вариант намного понятнее.
var getDiet = function (calorieArray, caloriesLimit) {
var countCalories = 0;
for (var i = 0; i <= calorieArray.length -1; i++) {
if (countCalories <= caloriesLimit) {
countCalories += calorieArray[i];
if (countCalories > caloriesLimit) {
break;
}
}
}
return i;
}