Испытание средней сложности "запасы протеина"

ВОТ ЭТО РЕШЕНИЕ Я НАШЁЛ ЗДЕСЬ НА ФОРУМЕ
for (var i = 1; i <= days; i++) {
if (i % period === 0) {
total += workDayAmount;
if (i % 7 === 6 || i % 7 === 0) {
total -= workDayAmount;
total += weekendAmount;
}
}
}
У меня такое решение тоже сразу всплыло в голове. Но вопрос, не пойму в проверке ПЕРВОЙ субботы, которая идёт в счётчике под номером 6. При остатке от деления 6 на 7 остатка не будет же 6, да и вообще остатка не будет или как??? У меня решение тормозилось как раз изза первой субботы с индексом 6

При делении меньшего числа на большее не будет целой части, а остаток есть - само это число.

Это я написал сам, не юзая подсказку, надеюсь поможет.

for (var i=period; i<=days; i+=period) {
 if ((i==2*period) || (i==7*period)) {
    total += weekendAmount;
    console.log(total);
    } else {
        total += workDayAmount;
        console.log(total);
      }
}

Не отображается, потому что код в сообщении нужно форматировать с помощью кнопки </> на панели сверху в редакторе сообщений.

Я над этим местом i % 7 === 6 тоже долго размышляла, пришла к выводу, что JS в этом случае считает остатком всё что не смог поделить, т.е. раз 6 на 7 не делится - значит 6 в остатке.)))

2 лайка

Мой вариант -

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

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

Мое решение

И еще мое решение (подсказку не юзал) П.С. Очень люблю условия сводить к переменным, а не прописывать там уравнения)

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

while (day <= days) {
i = day % period;
sat = (day + 1) % 7;
sun = day % 7;
if (!i) {
if (!sat || !sun) {
total += weekendAmount;
}
else {total += workDayAmount;}
}
day ++;
}
console.log(total);

Еще вариант с остатком деления

for (var i = period; i <= days; i += period) {
  
  if (i % 7 !== 0 && (i+1) % 7 !==0) {
    total += workDayAmount;
    }
    else {
      total += weekendAmount;
      }
  }

Мой вариант. Жизнеспособно?

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) {     
    if (i % 7 === 0 || (i+1) % 7 === 0) {
    total += weekendAmount;
    }
    else {
      total += workDayAmount;
    }
  }
}
console.log(total);

вполне. (i+1) % 7 === 0 вот это только поменять на i % 7 === 6 и будет отлично.
должно быть вы не до конца понимаете работу оператора остатка от деления, почитайте спецификацию.
правда лишние итерации цикла идут, что сказывается на быстродействии.
for (var i = period; i <= days; i += period) { ... } вот так получше будет. в 3 раза меньше итераций.
*sarcasm mode on
а так, код работает - вот и отлично (делайте код с ошибками, тогда у разработчика после вас будет работа для рефакторинга xD)
*sarcasm mode off

спасибо за конструктивную критику. Со всем согласна, буду учиться дальше

Ребят помогите разобраться( В предпоследней проверке выдаёт 1500 вместо 1400.
Мне бы хотелось понять ошибку в моей логике.

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

for ( var i = 1; i <= days; i++ )
{
if( !(i % 7) ){ weekIndex++; }
if ( !(i % period) ) {
if( i - 7 * weekIndex > 5 ) { total += weekendAmount; }
else { total += workDayAmount; }
}
}

  1. нафига вам столько итераций? вы тут запутались, вам нужно аккумулировать значение только в день периода, т.е. цикл должен иметь
    for (var i = period; i <= days; i += period) {...}
  2. потрудитесь объяснить что такое weekIndex, а именно запись
    if( !(i % 7) ){ weekIndex++; }
  3. если непонятно, подставляйте в цикл вывод в консоль, чтобы определить, на какой итерации возникает косячок

(не то, чтобы я не понимаю, просто объясните в первую очередь себе, как той самой резиновой уточке свой код)

Итак, пример:
сегодня 7 число, а неделя началась с понедельника. сегодня воскресенье. мы должны получить (если сегодня день периода) выходную пайку.
if( i - 7 * weekIndex > 5 )
weekIndex сегодня уже 1.
значит 7 - 7 * 1 > 5 ? неа, 0 меньше 5. выходную пайку не получаем - уже косяк.
И так каждое воскресенье, там вообще колоссальный разрыв будет.
Вердикт - вы не понимаете как работает остаток от деления. Неожиданно, неправда ли?
Потому что нам не нужно знать какая сегодня неделя. День может быть и 1153 и милион десятый, нам надо знать делится ли сегодняшнее число на 7 с остатком 6 (если суббота) или делится начисто с остатком 0 (если воскресенье).
При этом при всем нам нужно определять не каждый такой день, а лишь тот, на который приходится день периода. а значит итератор i++ не имеет смысла.

Ок. Спасибо большое) Это первый вариант который у меня возник в голове без подсказок.

let total = 0;

for (let day = period; day <= days; day += period) {
  let periodDay = day % 7

  if (!(currentDay % 6) || !(currentDay % 7)) {
    total += weekendAmount;
  } else  {
    total += workDayAmount;
  }
}