Решаем кодом задачу про наноботов
Захватят ли нанороботы мир?
Решаем кодом задачу про наноботов

У нас когда-то была зада­ча про скол­ков­ских нано­бо­тов и о том, захва­тят ли они мир. Тогда мы реши­ли её в тео­рии, и на это у нас ушла почти стра­ни­ца тек­ста. На этот раз мы исполь­зу­ем силу про­грам­ми­ро­ва­ния и решим эту зада­чу на Python.

Сама зада­ча зву­чит так:

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

Захва­тят ли скол­ков­ские нано­бо­ты всю пла­не­ту, если вырвут­ся из не очень хоро­шо охра­ня­е­мых скол­ков­ских лабо­ра­то­рий и нач­нут раз­мно­жать­ся в дикой при­ро­де?

Находим в тексте задачи важные моменты

Для нача­ла опи­шем всё, что есть в зада­че, и посмот­рим, что из это­го полу­чит­ся. Если всё нор­маль­но — пере­ве­дём с рус­ско­го на Python.

Вот что нам извест­но из тек­ста зада­чи.

  1. Есть сколько-то бак­те­рий, кото­рые живут на нашей пла­не­те.
  2. Есть сколько-то нано­бо­тов, кото­рые могут сбе­жать из лабо­ра­то­рии.
  3. Мы не зна­ем, сколь­ко вре­ме­ни зай­мёт их про­ти­во­сто­я­ние, но мы зна­ем вот что:
  4. до тех пор, пока есть на Зем­ле нуж­ные бак­те­рии,
  5. каж­дый нано­бот за одну секун­ду съе­да­ет одну бак­те­рию…
  6. …и сра­зу удва­и­ва­ет­ся.
  7. Каж­дая остав­ша­я­ся бак­те­рия удва­и­ва­ет­ся.
  8. И всё это про­ис­хо­дит каж­дую секун­ду.
  9. Если нано­бо­ты съе­дят всех бак­те­рий — мы долж­ны об этом узнать.

Мы про­сто запи­са­ли все дан­ные, кото­рые есть в зада­че, в виде про­стых пред­ло­же­ний. В каж­дом пред­ло­же­нии — ров­но одно дей­ствие.

Записываем текст в виде кода

Теперь давай­те пере­ве­дём эти 9 пред­ло­же­ний в коман­ды на язы­ке Python. Пра­ви­ло про­стое: одно пред­ло­же­ние = одна коман­да. Что­бы было ещё про­ще, мы доба­вим ком­мен­та­рии и про­ну­ме­ру­ем их точ­но так же, как наши пред­ло­же­ния.

    
language: Python 3
# 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) + ' сек.')


Ско­пи­ро­вать код
Код ско­пи­ро­ван

Разбираемся, что происходит

Мы все­го лишь раз­ло­жи­ли исход­ный текст зада­чи на про­стые кир­пи­чи­ки, кото­рые потом пре­вра­ти­ли в рабо­чий код.

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

Как это выполнить

Испол­нить этот код мож­но раз­ны­ми спо­со­ба­ми, вот самый дру­же­люб­ный с точ­ки зре­ния интер­фей­са:

  1. Захо­ди­те на anaconda.com/distribution/ и ска­чи­ва­е­те себе све­жую «Ана­кон­ду» — это пакет для испол­не­ния вся­ко­го на Python.
  2. Уста­нав­ли­ва­е­те как обыч­ную про­грам­му.
  3. Нахо­ди­те в при­ло­же­ни­ях Anaconda Navigator.
  4. В нём запус­ка­е­те Jupyter Notebook.
  5. Созда­ё­те новый ноут­бук в какой-то пап­ке, где вам надо.
  6. Копи­па­сти­те код.
  7. Нажи­ма­е­те Shift + Enter.
  8. Под вашим кодом выво­дит­ся чис­ло секунд, за кото­рое нано­бо­ты захва­тят мир.

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

Python — это не только инновации Сколкова
Это ещё и полез­ные при­ло­же­ния, дата-сайенс, ней­ро­ноч­ки и дру­гие инте­рес­ные шту­ки. При­хо­ди­те в «Прак­ти­кум», что­бы всё это изу­чить. Сла­ва нано­бо­там!