Третья программа "Протеиновый коктейль"


#1

Поделитесь своими вариантами.

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

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

console.log('На период в ' + days + ' дней' + ' необходимо ' + total + ' протеина');

Также хотелось бы узнать у всех присутствующих, понятно ли вам было из условия задания, что понедельник не является первым днем приема протеина?

  • Понятно (так и написано в условии)
  • Не понятно (в условии написано, что понедельник - первый день, следовательно первый день приема)
  • Вообще не понятно условие

0 голосов

В зависимости от результатов можно будет понять, стоит ли написать об этом явно.


#2

Совершенно не понятно было)

Не знаю как для других, а для меня фраза "после понедельника я принимаю протеин каждый третий день, то есть в среду, субботу и так далее."
Звучит как: первый день приёма - понедельник, второй день - среда, третий день - суббота, четвёртый день - вторник и т.п.

С другой стороны, логику, описанную Вами в первом сообщении можно было вычислить, посмотрев на логи проверки задачи. Но по началу всё это - вынос мозга)


#3

Вот и я по тестам вычисляла, что у меня должно получиться.


#4

Отдельно хочется сказать о сложности задачи - за 2 часа не продвинулся ни на шаг.
На мой взгляд, она слишком суровая.


#5

Да, самая сложная из всех четырех, как мне показалось.


#6

Решил. Но если бы я краем глаза не подсмотрел решение другого участника, то вряд ли бы сам всё сделал.

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

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

#7

Не поясните, что это значит?


#8

“Если остаток от деления i на period равен нулю.”


#9

Понятнее ли стало с такой формулировкой?

Во-вторых, после понедельника я принимаю протеин каждый третий день, то есть во вторник (2) нет, в среду (3) да, в четверг (4) и пятницу (5) нет, в субботу (6) да, в воскресенье (7) и понедельник (8) нет и так далее.

#10

Увы, из-за вот этих двух слов, расположенных вместе в данном контексте - нет.


#11

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


#12

Предлагаю следующую формулировку: Понедельник - начало периода, протеин я принимаю каждый третий день, … и далее по тексту.


#13

И по сложности задачи: она реально не подъемная для людей которые как и я начали изучать JS только по этим курсам. Пол дня потратил, но так и не смог решить. В курсе до задачи практически нет аналога по которому можно понять как решить эту задачу… ну либо я настолько глуп…

В указанном выше решении мне не понятно, почему происходит суммирование в одну переменную двух значений:

Буду благодарен, если кто нибудь разъяснит по строкам логику происходящего во всем скрипте.


#14

Объясню на примере своего решения:

for (i = 1; i <= days; i++) {
    if (i % period == false) {
        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 total = 0; /* значение переменной total необходимо приравнять к нулю изначально, для того, чтобы выполнился дальнейший расчёт. */

Далее начинается цикл for, в котором перебираются значения i.

Условия:

  • начальное значение счётчика i = 1;

  • конечное значение i меньше или равно количеству дней;

  • шаг счётчика: i = i + 1;

Далее начинается проверка «Если условие (i % period == false) правда – выполнить код total += weekendAmount;

i % period == false – означает, что если остаток от деления дня недели на величину периода равен нулю (либо false, т.к. 0 == false) – значит номер дня (i) соответствует дню, в который нужно принимать протеин.

Далее начинается ещё одна вложенность цикла for - проверка «Если условие (i % 7 == 6 || i % 7 == 0) правда – выполнить код total += weekendAmount»;

i % 7 == 6 || i % 7 == 0 означает, что если остаток от деления дня на 7 равен 6 ИЛИ остаток от деления дня на 7 равен нулю – вернуть true.
Иначе – выполняется блок ELSE.

При помощи этого условия мы вычисляем выходные дни. Т.к. именно суббота и воскресенье всегда будут возвращать нам значения 6 и 0.

Таким образом, код сначала пересчитывает значение переменной total в блоке с выходными днями, а как только условия блока IF перестают выполняться, программа переключается в блок ELSE, где к уже имеющейся величине переменной total добавляются значения будних дней.

P.S:

запись total += weekendAmount означает: total = total + weekendAmount.
Аналогично с total += workDayAmount.


#15

Как такой вариант?

1 день, понедельник – нет,
2 день, вторник – нет,
3 день, среда – да,
4 день, четверг – нет,
5 день, пятница – нет,
6 день, суббота  – да,
7 день, воскресенье – нет,
8 день, понедельник – нет,
9 день, вторник – да
и так далее.

#16

Такая трактовка точно однозначная :slight_smile:


#17

Во первых спасибо за разъяснение!

Для меня не совсем понятно почему при переходе к else сохраняется значение total, полученное при выполнении условия (i % 7 == 6 || i % 7 == 0). Я считал, что если условие не выполняется и происходит выход на else то значение как бы обнуляется, поэтому пытался решить через суммирование значений.

Ведь фактически во всех уроках курса у нас было так, если условие if не выполняется, то переходим к else. И нигде не было показано такой вот логики, что и в проходе через условия if в переменную могут “накапливаться” значения, которые потом перейдут в ветку else…

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


#18

Убил 3 часа на решение этой задачи. Для начального уровня задача не совсем простая, с изюминкой.
Новичку может быть не понятно, как с каждым витком цикла переменная total будет накапливать данные.


#19

Пошел альтернативным путем )

var total = Math.floor(days/period)*workDayAmount-(Math.floor(days/21)+Math.floor((days-6)/21+1))*weekendAmount;

Попробовал вычислить цикличность выходных и через округления получилось решить таким образом.
Имеет такое решение право на жизнь?


#20

Здравствуйте, записал условие для провреки дней недели и третьего дня, начал заключать все это в цикл и при написании переключателя счетчика страница зависает и становится не рабочей, провал несколько раз и именно на одном и том же месте страница зависает, браузер использую гугл хром, пожалуйста подскажите что сделать. Заранее спасибо :slight_smile: