const getDiet = (food, limit) => {
var total = 0;
for (var i = 0; i <= food.length; i++) {
if (total > limit) {
return i - 1;
}
total += food[i];
}
}
решение с использованием только тех инструментов, которые обсуждались в предыдущих курсах.
Сводка
var getDiet = function (calories, calorieLimit) {
var total = 0;
for (var i = 0; i < calories.length; i++) {
total += calories[i];
if (total > calorieLimit) {
return i;
}
}
};
const getDiet = (list, limit) => { const iter = (items, count, acc) => { const [first, ...rest] = items; const newAcc = acc + first; if (newAcc > limit) return count; return iter(rest, count + 1, newAcc); }; return iter(list, 0, 0); }
var getDiet = function (arrCalorieDishes, calorieLimit) {
var totalCalorie = 0;
var limitDishes = 0;
arrCalorieDishes.forEach(item => {
totalCalorie += item;
if (totalCalorie <= calorieLimit) limitDishes++;
});
return limitDishes;
}
чет ребята кто во что горазд, лишь бы короткий, быстрый и понятный код не написать
const getDiet = (calories, limit) => {
let quantity = 0;
while ( limit >= calories[quantity] ) {
limit -= calories[quantity];
quantity++;
}
return quantity;
};
Костыль ввиде i - 1, это плохо?
var getDiet = function (calories, limit) { var sum = 0; for (var i = 0; sum <= limit; i++) { sum += calories[i]; } // костыль ввиде i - 1, это плохо? return i - 1; }
Если да, то обьясните почему??
Нужно написать скрипт так, чтобы незнакомый человек прочитал и понял, что этот код делает. Я вижу функцию, которая берет некие калории и лимит, и мне совершенно непонятно, почему она возвращает значение служебной переменной минус единица. Какой в этом смысл?
Не зная условий первоначальной задачи трудно догадаться о сути происходящего.
раз пошла такая пьянка, решил написать максимально нечитабельный код в стиле чувачков выше зато в одну строку
const getDiet = (calories, limit) => calories.map((item, i) => item = calories.slice(0, i + 1).reduce((a, b) => a + b, 0)).filter(item => item <= limit).length;
Это круто, надо будет пошагово разобрать. Вот мне трудно выстраивать такие “абстрактные” цепочки, обычно получаются либо простяцкие решения “в лоб”, либо малопонятная нелогичная хрень.
а я объясню сразу, чтобы легче было понимать:
подзадачи:
- создать новый массив
calories.map(...)
, в котором элементы будут суммой каждых предыдущих элементов массива с калориями. т.е. длины этих массивов будут равны между собой.
а)item = calories.slice(0, i + 1)
// берем “подмассивы” длиной от 1го элемента до i+1, т.е. первый подмассив будет длиной 1, второй 2, третий 3 и так далее.
б) находим сумму членов таких “подмассивов”.reduce((a, b) => a + b, 0)
в) записываем в наш новый безымянный массив каждую такую сумму из (1б) - фильтруем наш массив так, чтобы отрезать его кончик, который будет больше лимита (это безопасно, т.к. мы точно знаем что каждый следующий элемент массива больше предыдущего)
.filter(item => item <= limit)
- находим длину отфильтрованного, это и есть ответ
.length
чтобы было вообще нечитабельно, надо поменять названия переменных на a,b,c,d… (не учитывая коллбеки)
так сказать “вредные советы” in da thread
Хвались, как дошел до такой жизни? Конкретно на этом примере.
Шел от обратного или внутренний злой гений?
ну учили всегда разбивать задачу на подзадачи, подумал как можно “быстро” найти итератор, не выделяя его в отдельную переменную (потому что хочу использовать стрелочную функцию, чтобы в 1 строчку все было азаза). потому циклы отбросил сразу (т.к. там минимум 1 итератор надо создавать).
поэтому итератором стало свойство объекта массива - length. значит нам надо сделать новый массив.
длина этого массива должна быть ограничена таким последним максимально большим элементом, который меньше или равен лимиту.
а значит нам надо найти суммы.
ну получается что от обратного, да. практического смысла это не имеет, т.к. эта программа тяжелее обычного цикла с инкрементом, но в плане понимания методов перебирания массива очень ОК (а еще я практикуюсь пока авторы курсов не добавляют новые задачи)
.filter(item => item <= limit)
Жутко красивый фрагмент, вот есть в нем что-то такое… загадочное, притягательное
Я бы между стрелками запихнул текст “купи! всего 0,99 центов”
я вот так сделал
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;
}
У меня такое решение вышло:
var getDiet = function(calories, limit) {
for(var i = 0; i < calories.length; i++) {
if(limit >= calories[i]) {
limit-= calories[i];
} else {return i};
}
};