У нас когда-то была задача про сколковских наноботов и о том, захватят ли они мир. Тогда мы решили её в теории, и на это у нас ушла почти страница текста. На этот раз мы используем силу программирования и решим эту задачу на Python.
Сама задача звучит так:
Нашу планету ровным слоем покрывает большая колония бактерий, они находятся буквально везде. Неожиданно в Сколкове изобретают высокотехнологичных наноботов, которые имеют способность самовоспроизводиться при съедании этих бактерий. Каждую секунду сколковский нанобот пожирает одну бактерию и сразу делится на два таких же нанобота. Бактерии просто питаются подножным кормом и тоже каждую секунду делятся пополам, но просто так, сами по себе.
Захватят ли сколковские наноботы всю планету, если вырвутся из не очень хорошо охраняемых сколковских лабораторий и начнут размножаться в дикой природе?
Находим в тексте задачи важные моменты
Для начала опишем всё, что есть в задаче, и посмотрим, что из этого получится. Если всё нормально — переведём с русского на Python.
Вот что нам известно из текста задачи.
- Есть сколько-то бактерий, которые живут на нашей планете.
 - Есть сколько-то наноботов, которые могут сбежать из лаборатории.
 - Мы не знаем, сколько времени займёт их противостояние, но мы знаем вот что:
 - до тех пор, пока есть на Земле нужные бактерии,
 - каждый нанобот за одну секунду съедает одну бактерию…
 - …и сразу удваивается.
 - Каждая оставшаяся бактерия удваивается.
 - И всё это происходит каждую секунду.
 - Если наноботы съедят всех бактерий — мы должны об этом узнать.
 
Мы просто записали все данные, которые есть в задаче, в виде простых предложений. В каждом предложении — ровно одно действие.
Записываем текст в виде кода
Теперь давайте переведём эти 9 предложений в команды на языке Python. Правило простое: одно предложение = одна команда. Чтобы было ещё проще, мы добавим комментарии и пронумеруем их точно так же, как наши предложения.
# 1. Сколько на старте будет бактерий
bact = 10
# 2. Сколько у нас на старте наноботов
nano = 1
# 3. Пройденное время в секундах
sec = 0
# 4. Цикл будет работать до тех пор, пока есть хоть одна бактерия
while bact > 0:
    # На каждом шаге:
    # 5. Каждый нанобот съедает по одной бактерии, потому что сколько будет наноботов → столько и бактерий они съедят
    bact = bact - nano
    # 6. Наноботы удваиваются
    nano = nano * 2
    # 7. Бактерии удваиваются
    bact = bact * 2
    # 8. Время течёт
    sec = sec + 1
# 9. Если программа не зависнет в бесконечном цикле, не выкинет ошибку, а просто выведет число — наноботы победили вот за такое время
print(str(sec) + ' сек.')
Как угадать число за 7 попыток: математический трюк
Задача про охрану периметра
Решаем как программисты: таракан на стене
Решаем кодом задачу про безумного рекрутера
Решаем кодом: программа угадает число за 7 попыток
Простейший математический фокус
Как вычислить день рождения
Мама против вирусов
Задача про периметр и забывчивого монтажникаРазбираемся, что происходит
Мы всего лишь разложили исходный текст задачи на простые кирпичики, которые потом превратили в рабочий код.
Теперь мы можем менять исходные параметры задачи — количество бактерий или наноботов — и смотреть, как это повлияет на время. Для этого мы используем две переменных в самом начале, где прописывали стартовые значения.
Как это выполнить
Исполнить этот код можно разными способами, вот самый дружелюбный с точки зрения интерфейса:
- Заходите на anaconda.com/distribution/ и скачиваете себе свежую «Анаконду» — это пакет для исполнения всякого на Python.
 - Устанавливаете как обычную программу.
 - Находите в приложениях Anaconda Navigator.
 - В нём запускаете Jupyter Notebook.
 - Создаёте новый ноутбук в какой-то папке, где вам надо.
 - Копипастите код.
 - Нажимаете Shift + Enter.
 - Под вашим кодом выводится число секунд, за которое наноботы захватят мир.
 

Не каждую задачу можно вот так легко разложить на одношаговые команды. Часто приходится делать так: раскладывать задачу на несколько задач поменьше, потом с ними делать то же самое, а уже самые мелкие итоговые задачи выполнять с помощью понятных команд. Чтобы реализовать это в коде, чаще всего используют функциональное программирование или ООП.