ВОТ ЭТО РЕШЕНИЕ Я НАШЁЛ ЗДЕСЬ НА ФОРУМЕ
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 в остатке.)))
Мой вариант -
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; }
}
}
- нафига вам столько итераций? вы тут запутались, вам нужно аккумулировать значение только в день периода, т.е. цикл должен иметь
for (var i = period; i <= days; i += period) {...}
- потрудитесь объяснить что такое
weekIndex
, а именно запись
if( !(i % 7) ){ weekIndex++; }
- если непонятно, подставляйте в цикл вывод в консоль, чтобы определить, на какой итерации возникает косячок
(не то, чтобы я не понимаю, просто объясните в первую очередь себе, как той самой резиновой уточке свой код)
Итак, пример:
сегодня 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;
}
}