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


#21

“…которое будет ответом, является остатком от деления, а в определении этот факт отрицается” Можете математически это показать? То есть то что при делений 1 на 2 остаток получится 1? Я вам написал что 1/2=0,5 Вы на это сказали что десятич. дроби не интересуют. Как же вы получили 1?

"Правильно будет так: “при делении меньшего числа на большее остатком от деления будет само это число”. И снова ошиблись.
Почему вы считаете, что при делении любого числа (Х) на большее число (Y) остаток всегда будет равен делимому числу(Х)???


#22

Вы считате иначе? Может пример приведёте для опровержения, раз говорите, что я ошибаюсь?


#23

Ну, да. Легко:
6/7=0,857
7/8=0,875
9/10=0,9


#24

Следуя вашей логике остатками от деления в данном случае будут соответственно 857, 875 и 9?


#25

Вы передергиваете. Я такого не говорил. Я всего лишь привел пример как вы и просили.

Как вы легко видите 0,857 не равен 6, etc.

А вы не могли бы объяснить как вы получили остаток равный 1, при делении 1/2?


#26

1 % 2
целой части нет - она равна нулю. 0 * 2 = 0
1 - 0 = 1

Другой пример: 5 % 3
целая часть равна 1. 1 * 3 = 3
5 - 3 = 2

Остаток от деления - это целое число, а не дробное.


#27
  1. Я в курсе.

  2. Я вас просил объяснить как вы получили математический остаток =1 при делении 1 / 2, вы же расписали работу оператора “%”. Я в курсе как работает этот оператор.
    Второй пример 5%3 - (т.е. когда делимое больше делителя) в контексте нашей беседы вообще излишен, т.к. речь шла только о случаях: делимое<делителя.

  3. Вместо вот этих расчетов

не проще ли просто брать делимое число?


#28

Однако вы тоже вышли за рамки этого случая.

В том и проблема, что вы не видите разницы между 1/2 и 1 % 2. Говорили об остатке от деления, теперь о простом делении. Чего хотите, не понимаю


#29

Уже ничего. Спасибо за ответы.


#30

если число меньше делителя, то остатком от деления оно и является. это и без ЯП очевидно.
собственно это верно и в других ситуациях. число уменьшается на N целых делителей, пока не станет меньше делителя и возвращается в результате

операция применима естественно только ко множеству целых чисел. молите богов жабаскрипта, что не заставляют вас приводить числа к числовым типам, типа integer, float и пр.


#31

var days = 5; // Дней в периоде
var evenDayAmount = 200; // Количество протеина в чётные дни
var oddDayAmount = 100; // Количество протеина в нечётные дни
var total = 0; // Общее количество протеина

for (days; days >= 1; days–) {
if ((days % 2) === 0) {
total = total + evenDayAmount;
}

else {
total = total + oddDayAmount;
}

}
console.log(total);


#32

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

for(var i = 1; days >= i; i++) {

if (i % period === 0) {

  var dayWeek =i % 7;
  
  if (dayWeek > 0 && dayWeek < 6) {
    total += workDayAmount;
  } else {
    total += weekendAmount;
  }

}
}

console.log(total);


#33

Не догадался использовать % для определения выходного дня. Выходные дни нашел так: первый выходной день увеличивал на 7 в каждом цикле. Определил отдельно сумму для каждого третьего дня и для выходных дней, и нашел разницу между ними. Получилось громоздко, немного топорно и притянуто за уши, но в целом код рабочий)

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

if ( days => 6){
for (var i = 6; i <= days; i += 7){
if (i % 3 === 0) {
weekEnd += weekendAmount;
 }
 }
 }
if ( days => 7){
for (var i = 7; i <= days; i += 7){
if (i % 3 === 0) {
weekEnd += weekendAmount;
}
}
}
for (var i = 1; i <= days; i++) {
if (i % 3 === 0) {
workDay += workDayAmount
}
}  
total = workDay - weekEnd;

#34

В Visual Studio Code все работает как надо, но редактор не принимает. В чем может быть проблема?

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

// мы вводим проверку, делится ли numberOfDays на 3 без остатка. если да, то кормим кота.

for(var name = 1, numberOfDays = 1; numberOfDays <= days; name++, numberOfDays++) //what day is it today?
{
if (numberOfDays%3 === 0)
{
if (name >= 1 && name <= 5) //today is workday
{
total = total + workDayAmount;
}
if (name === 6) //today is weekend
{
total = total + weekendAmount;
}
if (name === 7) //today is weekend
{
total = total + weekendAmount;
name = 0;
}
}
else
{
if (name === 7)
{
name = 0;
}
}

}

console.log(total);


#35

console.log(numberOfDays = ${numberOfDays}, name = ${name}, total = ${total});

вот это добавьте последним в цикл, чтобы проинспектировать, с какого момента у вас косячки начинают идти.

у вас не используется переменная period почему-то.
и есть решение попроще, слишком мудрено у вас

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

// мы вводим проверку, делится ли numberOfDays на 3 без остатка. если да, то кормим кота.

for (var name = 1, numberOfDays = 1; numberOfDays <= days; name++, numberOfDays++) {
  if (numberOfDays % period === 0) {
    if (name >= 1 && name <= 5) {total += workDayAmount;}
    if (name == 6 || name == 7) {total += weekendAmount;}
  }
  if (name == 7) {name = 0;}
  
console.log(`numberOfDays = ${numberOfDays}, name = ${name}, total = ${total}`);

}

#36

Нашел ошибку. Ответили тут https://toster.ru/q/612902.
А переменная period не используется так как это решение работает только для period = 3; Поэтому не стал подставлять переменную в решение.


#37

ну я вам там поправил, на будущее, если используете var, то при сравнении числовых переменных используйте нестрогое сравнение “==”. Почему так происходит - объяснение доступно только для тех, кто глубоко погрузился в этот безумный язык. Ну для прикола можете после объявления переменной через var проверить его тип: console.log(typeof(name)); например. оно будет строкой =) поэтому строгое сравнение c числом в условии не будет срабатывать никогда.
А лучше изучите let и const и используйте только их.


#38

Всем привет!) У меня получилось вот такое решение (сначала):

var days = 25; // Дней в периоде
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 && i % 6 === 0 || i % 7 === 0) {
      total = total + weekendAmount;
      console.log(total);
    } else {
      total = total + workDayAmount;
      console.log(total);
    }
  }
}

И это решение работает. Может вопрос глупый: но почему оно срабатывает на проверке???

Если посмотреть, то во втором условии я проверяю только первую неделю на тип дня недели (будни / выходные), а дальше по идее всегда должно срабатывать действие, указанное в else.

Но ведь это не правильно?! Или все ок?


#39

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

моя первая реакция

а потом доперло.

нет, все неправильно, вы просто Нео, уворачивающийся от проверок.

Нео

объясню: ни одна проверка не выпадает на субботу следующих за первой недель
а еще вы не понимаете как работает остаток от деления, суббота это 6 день 7-дневной недели. значит i % 7 == 6 будет субботой, а не ваше i % 6.

рассмотрим недели, где i > 7 (которое заведомо false)
if (false && false || true) {/*bla-bla-bla*/} - как решится это условие по воскресеньям?
первая операция по приоритету будет (false && false) - это даст [false] в итоге (и она будет давать false всегда, начиная со второй недели)
вторая операция ([false] || true) - по воскресеньям условие всегда дает true, независимо от того, какие операнды подставить в первые две логики условия.

а суббота по тестам вам просто не попадается вне первой недели :joy:
так что вы – Нео, гордитесь, что написали неправильный код, который обошел проверку :sunglasses:

естественно код нужно переделать на правильный, мой совет - сократите количество итераций цикла, можно же стартовать сразу со значения period и прибавлять его же в цикле, проверка на i <= 7 вообще бесполезная, она ничего не показывает, кроме того, что неделя не первая.

@GreenLera а можно тесты для этой задачи переделать? тут человек обошел проверку очень элегантно. Например, подгадать такие периоды и длину цикла, чтобы проверка выпадала на субботу и воскресенье внутри одного теста.


#40

Спасибо большое за разъяснение! Теперь все встало на свои места :slight_smile:
Но до Нео мне еще далеко :joy: - это решение вышло случайно, но интуиция подсказывала, что я решила задачку не честно :face_with_raised_eyebrow: и решила выяснить это!
Сейчас уже разобралась с оператором %, а то он действительно вводил меня в ступор, когда делимое было меньше делителя.