У нас когда-то была задача про сколковских наноботов и о том, захватят ли они мир. Тогда мы решили её в теории, и на это у нас ушла почти страница текста. На этот раз мы используем силу программирования и решим эту задачу на 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) + ' сек.')
Разбираемся, что происходит
Мы всего лишь разложили исходный текст задачи на простые кирпичики, которые потом превратили в рабочий код.
Теперь мы можем менять исходные параметры задачи — количество бактерий или наноботов — и смотреть, как это повлияет на время. Для этого мы используем две переменных в самом начале, где прописывали стартовые значения.
Как это выполнить
Исполнить этот код можно разными способами, вот самый дружелюбный с точки зрения интерфейса:
- Заходите на anaconda.com/distribution/ и скачиваете себе свежую «Анаконду» — это пакет для исполнения всякого на Python.
- Устанавливаете как обычную программу.
- Находите в приложениях Anaconda Navigator.
- В нём запускаете Jupyter Notebook.
- Создаёте новый ноутбук в какой-то папке, где вам надо.
- Копипастите код.
- Нажимаете Shift + Enter.
- Под вашим кодом выводится число секунд, за которое наноботы захватят мир.
Не каждую задачу можно вот так легко разложить на одношаговые команды. Часто приходится делать так: раскладывать задачу на несколько задач поменьше, потом с ними делать то же самое, а уже самые мелкие итоговые задачи выполнять с помощью понятных команд. Чтобы реализовать это в коде, чаще всего используют функциональное программирование или ООП.