Решаем как программисты: таракан на стене

У нас есть зада­ча про тара­ка­на, как он пол­за­ет по стене и хочет забрать­ся к сосе­дям. Мы уже реша­ли её обыч­ным спо­со­бом, теперь сде­ла­ем это на Python. Пото­му что Python — это кру­то, Python — это класс, не было бы Python — не было бы нас.

Условие задачи

В ваш подъ­езд дву­мя эта­жа­ми ниже въе­ха­ли новые жиль­цы, кото­рые при­вез­ли с собой тара­ка­нов. Насе­ко­мые в поис­ках еды ста­ли полз­ти вверх по вен­ти­ля­ци­он­ной шах­те и ско­ро добе­рут­ся до вашей квар­ти­ры. Но караб­кать­ся вверх им неудоб­но: за час они под­ни­ма­ют­ся на 1 м, но сра­зу после это­го теря­ют рав­но­ве­сие и ска­ты­ва­ют­ся на ⅔ м вниз.

Вопрос: сколь­ко часов у вас есть на покуп­ку лову­шек для тара­ка­нов, если рас­сто­я­ние от вас до сосе­дей по вен­ти­ля­ци­он­ной шах­те — 7 м?

Задаём условия

У про­грам­ми­стов счи­та­ет­ся пра­виль­ным делать все зна­че­ния не жёст­ко задан­ны­ми чис­ла­ми в коде, а пере­мен­ны­ми. Это удоб­но, когда меня­ют­ся исход­ные дан­ные: доста­точ­но пере­смот­реть зна­че­ние пере­мен­ной в одном месте, а не искать эти циф­ры по все­му коду. Поэто­му пер­вое, что мы сде­ла­ем, — зада­дим началь­ные усло­вия задачи:

# Высота вентиляционной шахты
mine = 7
# Сколько таракан проползает за час
speed = 1
# Расстояние, на которое сползает уставший таракан
slowdown = 2/3
# Сколько метров прополз таракан
done = 0
# Сколько часов он на это потратил
hours = 0

Если нам пона­до­бит­ся поме­нять высо­ту шах­ты или ско­рость спол­за­ния, мы смо­жем это сде­лать быст­ро, пото­му что все дан­ные у нас запи­са­ны в одном месте.

Алгоритм для решения

Теперь напи­шем алго­ритм, кото­рый будет счи­тать часы, кото­рые пона­до­бят­ся тара­ка­ну на дви­же­ние по шах­те. Основ­ная мысль такая:

Каж­дый час тара­кан про­пол­за­ет опре­де­лён­ное рас­сто­я­ние наверх и немно­го спол­за­ет вниз. При этом мы посто­ян­но про­ве­ря­ем, достиг он края шах­ты или нет.

Запи­шем эту мысль в виде кода:

# Пока пройденное расстояние меньше длины шахты — ползём дальше
while done <= mine:
    # Прошёл час
    hours += 1
    # За этот час таракан прополз сколько-то метров 
    done += speed
    # Если он дополз до края — принудительно останавливаем цикл
    if done >= mine:
        break
    # Усталый таракан в конце часа скатывается вниз
    done -= slowdown

Здесь мы исполь­зу­ем опе­ра­то­ры += и -=. Они рабо­та­ют так: берут пере­мен­ную и при­бав­ля­ют или отни­ма­ют от неё то зна­че­ние, кото­рое сто­ит после опе­ра­то­ра. Напри­мер, 3 += 2 будет 5, а 10 -= 4 будет 6. Послед­нее, что нам оста­лось, — выве­сти резуль­тат рабо­ты на экран:

# Выводим количество полученных часов print("Таракану понадобится" ,hours, "часов.")

Гото­вый код (вставь­те в Jupyter и нажми­те Shift + Enter):

# Высота вентиляционной шахты
mine = 7
# Сколько таракан проползает за час
speed = 1
# Расстояние, на которое сползает уставший таракан
slowdown = 2/3
# Сколько метров прополз таракан
done = 0
# Сколько часов он на это потратил
hours = 0
# Пока пройденное расстояние меньше длины шахты — ползём дальше
while done <= mine:
    # Прошёл час
    hours += 1
    # За этот час таракан прополз сколько-то метров 
    done += speed
    # Если он дополз до края — принудительно останавливаем цикл
    if done >= mine:
        break
    # Усталый таракан в конце часа скатывается вниз
    done -= slowdown
# Выводим количество полученных часов
print("Таракану понадобится" ,hours, "часов.")

Теперь с помо­щью это­го кода мы можем решить любую зада­чу про тара­ка­на с раз­ны­ми началь­ны­ми усло­ви­я­ми. Что­бы их поме­нять, доста­точ­но пере­де­лать нуж­ную пере­мен­ную в самом нача­ле программы.

Напри­мер, попро­буй­те поме­нять код, что­бы он решал ту же зада­чу, но с новым усло­ви­ем: каж­дые два часа тара­кан отды­ха­ет в тече­ние часа и нику­да при этом не ползёт.