JavaScript

Задача JavaScript, улитка в колодце (вн)

Есть решение, но всё равно не могу понять суть.
И depth это глубина колодца или то расстояние, на которое спускается улитка?
Задача:
Каждый день улитка проползает 7 футов вверх и каждую ночь опускается вниз на 2 фута.
Сколько дней потребуется улитке, чтобы подняться на указанную высоту?
Пример вводных данных:
31

Пример результата:
6

Пояснение: давайте определим расстояние, которое улитка преодолевает в день:
День 1: 7-2=5
День 2: 5+7-2=10
День 3: 10+7-2=15
День 4: 15+7-2=20
День 5: 20+7-2=25
День 6: 25+7=32
Таким образом, на 6 день улитка проползет 32 фута и выберется из колодца днем, не опустившись на 2 фута ночью.
function main() {
var depth = parseInt(readLine(), 10);
var day = 0;
var total = 0;
while (total < depth) {
day = day + 1;
total = total + 7;
if (total >= depth) {
console.log(day);
break;
}
total = total - 2;
}
}
Александр Ли
Александр Ли
19 459
Ну так что непонятно-то? Совсем по-детски объяснить? Хорошо: каждый день улиточка проходит 7 шагов; если пройдя эти 7 шагов улиточка всё ещё не на свободе, ей нужно вернуться на 2 шага назад. Исходя из вопроса, depth — и глубина колодца, и длина, которую улитке нужно преодолеть, т. е. эти два свойства равны, т. к. улитка начинает свой путь со дна колодца, и высота колодца равна длине, которую нужно преодолеть, чтобы из него выйти, поскольку предикат выхода из колодца верен тогда, когда улитка из него вылезла, а вылезти из него — преодолеть расстояние, равное высоте колодца.

Следовательно цикл работает до тех пор, пока пройдённое расстояние меньше высоты колодца (ведь если оно будет больше или равно, значит улитка вылезла из колодца). При каждой итерации день инкрементируется (ведь итерация цикла по сути является этим самым "днем"), а пройденное расстояние увеличивается на 7 (ведь улитка ходит именно столько). После того, как в очередной день улиточка прошла 7 шагов, в цикле проверяется, а не вышла ли она теперь из колодца (total >= depth), и если нет, то из количества пройденных шагов отнимается 2, т. е. улиточка возвращается на 2 шага назад.

Цикл тут, конечно, никакой не нужен, но если очень хочется, то позволительно, особенно в учебных целях. Но по-хорошему решать такое исключительно математически, например так:

const daysToSave = d => d < 1? 0 : Math.round(d / 5) || 1
Данил Розенблюм
Данил Розенблюм
6 058
Лучший ответ
Александр Ли Спасибо за развернутый ответ. Без подробного объяснения очень трудно понять как решить задачу в самом коде. Только две недели назад начал изучать JavaScript. Дошёл уже до объектов, ну это теория, а вот практика вообще пока никак.
Narek Artyomich
Narek Artyomich
90 308
Так и что тебе не понятно?
Александр Ли Что значит здесь depth? Как я понял, total это расстояние, которое проходит улитка, а вот depth не знаю, что означает.