Испытание "Запасы протеина"

var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;

for (var i = 1; i <= days; i++) {
if (i % period === 0) {
total += workDayAmount;
if (i % 7 === 6 || i % 7 === 0) {
total -= workDayAmount;
total += weekendAmount;
}
}
}

Прошу критики

2 лайка
Summary
  var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;
for(var i = 1; i <= days; i++) {
  if(i % period === 0) {
    total += workDayAmount;
    if(i % 7 == 6 || i % 7 == 0) {
      total -= weekendAmount;
      }
  }
}

Зачем нужна эта проверка?:

if(i % period === 0) {...}

Если цикл можно написать так:

for (var i = period; i <= days; i +=period) {...}
6 лайков

А можете, пожалуйста, полностью написать ваш код? Просто я заменила у себя проверку

if(i % period === 0) {...}

на ваш цикл и у меня не работает, может что-то еще нужно дописать

Да, вот:

var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;

for (var i = period; i <= days; i +=period) {
  if (i%7 === 6 || i%7 === 0) {
    total +=weekendAmount;
  } else {
    total +=workDayAmount;
  }
}
10 лайков

В своем решении я указывал в for, что i = 3. На мой взгляд, так решение не изменится, если в условии period больше не будет равен 3. Но для решения этой задачи… Впрочем, жто мой вариант:

var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;

for (i = 3; i <= days; i += period) {
if (i%7 === 6 || i%7 === 0) {
total += weekendAmount;
} else {
total += workDayAmount;
}
}

var days = 25; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var weeks = Math.floor(days/7);
var total=0;
for (var i=period; i<=days; i+=period) {
for (var j = 0; j<=weeks; j++) {
if ((i+7)%7==6 ||i%7==0) {
total+=weekendAmount;
}
else {total+=workDayAmount;
}break
}
}

Господи, какой же ужас я написал…но он работает!)))

объясните пж что означает f (i%7 === 6 || i%7 === 0)

4 лайка

Приветствую) У меня была ошибка из-за этого, полностью не проходил тест, оказалось причина именно в %7 === 6; - вместо этого я указал %6 === 0;

В подсказке к заданию было объяснение:

Для определения дня недели тоже поможет % : номер дня в периоде делим на 7 , в остатке > получаем номер дня в неделе . Для воскресенья остаток будет равен 0 . Например, поделим > 15 по счёту день в периоде на 7 , в остатке получится 1 . Значит это понедельник.

if (i%7 === 6 || i%7 === 0)

В это коде i%7 === 0 - это воскресенье, так как он 7-й день в недели
А i%7 === 6 - дает остаток 6, а 6-й день недели у нас суббота.

А в условие к задачи было сказано, что нужно в выходные дни, то есть в субботу (6) и в воскресенье (7) сумму протеина указать 100, в 2 раза меньше от суммы протеина в будние.

i%7 === 3 - это будет средой и т.д.

6 лайков

var days = 456; // Дней в периоде
var period = 2; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var daysCount = 0;
var total = 0;

while (daysCount < days) {
daysCount++;
if (daysCount % period === 0) {
if (daysCount % 7 === 6 || daysCount % 7 === 0) {
total += weekendAmount;
} else {
total += workDayAmount;
}
}
}

var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будние
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;
var dayOfWeek = 1; // День недели

for (var i = 1; i <= days; i++) {
if (i % period == 0) {

if (dayOfWeek == 6 || dayOfWeek == 7) {total += weekendAmount} else {total += workDayAmount}

}
dayOfWeek += 1 //Увеличиваем счетчик дня недели
if (dayOfWeek > 7) {dayOfWeek = 1} //Обнуляем счетчик на начало новой недели
}

var i = period;
var total = 0;

while (i <= days) {
if (i % 7 === 0 || i % 7 === 6) {
total += weekendAmount;
} else { total += workDayAmount;
}
i += period;
}
console.log(total);

ВАЖНО! Возможно, об этом говорилось в теории, но я не уверен: оказывается оператор “взятие остатка %”, если число слева от него меньше числа справа от него возвращает число слева от оператора, а не остаток от деления. Например
1 % 2 // 1
-2 % 3 // -2
А то я все никак не мог понять почему выполняется условие i % 7 === 6 для i = 6, то есть для первой субботы.

6 лайков

Это и есть остаток от деления.
Например, 1 % 2. Вы делите 1 на 2: целой части не будет, она равна нулю, остается 1.

1 лайк

Если поделить 1 на 2 получится 0,5 целой части не будет (=0) - согласен, но остаток разве не будет = 5?

1 лайк

Нет. 0.5 - это десятичная дробь, нас же интересует остаток от деления на 2.

Если десятич. дробь не интересует, то как же вы поделили 1 на 2 и у вас осталось 1?

Операция находит число, которое не делится на 2 без остатка. На этом вычисления заканчиваются, понимаете? А вы продолжаете делить.

1 лайк

Вашу мысль я уловил, но вы дали неверное определение: “Операция находит число, которое не делится на 2 без остатка. На этом вычисления заканчиваются…”. Например, 5 не делится на 2 без остатка (любое нечетное число не делится на 2 без остатка) по вашему определению операция должна остановиться.
То определение которое дал я более точно: “если число слева от него (оператора) меньше числа справа от него (то оператор) возвращает число слева от оператора, а не остаток от деления”.

1 лайк

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

Правильно будет так: “при делении меньшего числа на большее остатком от деления будет само это число”.