Максимальная оптимизация робота

В прошлой статье я пытался провести конкурс, но, видимо, количество посетителей блога, да еще и программистов было не велико и конкурс провалился. Ну да ладно — неудачный опыт — тоже опыт. В таком случае, предлагаю рассмотреть варианты прохождения всех уровней в игрушке lightBot.
Если Вы впервые знакомитесь с СветоРоботом, то советую прочитать мою предыдущую статью — там рассказано о доступных командах для робота.
Первый уровень проходится у всех стандартно.
LightBot - скриншот прохождения первого уровня

Во втором уровне уже можно использовать функции. В данном случае имеются повороты. На каждый поворот нужно потратить 3 хода. Построив наиболее прямой путь движения, мы получим всего 2 поворота. Указав две функции на поворот, мы сэкономим одну команду (3 команды на один поворот + еще 3 на второй поворот против 2 команд на выполнение функции + 3 команды самой функции).
LightBot - скриншот прохождения второго уровня
В третьем уровне необходимо перескочить препятствие и активировать 3 подряд находящиеся платформы. Также как и во втором уровне, в этом мы экономим 1 команду, вызвав 3 функции по 2 команды каждая. Больше автоматизировать на данном уровне не получается — перепрыгивание препятствия проводится без использования функций.
LightBot - скриншот прохождения третьего уровня
Четвертый уровень интересен тем, что даже не знаешь на чем можно выгадать лишние команды. Вроде бы и подъем только один, но и прямая дорога до лампочки не длинная. В данном случае, я решил сделать симбиоз команд — когда в одной функции есть и прыжки и проходы. Фактически, в функции указаны ходы по прохождению первого участка пути (до первого поворота). А дальше было решено использовать эту же функцию из-за того, что в ней уже имеются команды по движению вперед — и новую функцию не требуется писать и ходы будем экономить. с каждым вызовом функции робот пройдет две клетки вперед, а использована будет одна команда. Это первый уровень, где во благо оптимизации, идет жертва реальному количеству выполненных команд — робот совершает во второй половине пути ненужные прыжки.
LightBot - скриншот прохождения четвертого уровня
В пятом уровне маразм крепчает.. Во главу угла мы ставим функцию с, на первый взгляд, простым набором команд — прыжок, ходьба и лампочка. Но эти команды так часто используются при движении робота, что без них никуда. Также, имеет значение и порядок этих действий — поставь бы мы их по другому и количество команд бы изменилось (только неизвестно в какую сторону — по мне — так в большую). Этот уровень интересен тем, что здесь приходится использовать вторую функцию для наилучшего эффекта оптимизации. И здесь же одна функция вызывает другую. Здесь также — робот выполняет много лишних движений, но все в угоду оптимизации рабочего кода.
LightBot - скриншот прохождения пятого уровня
В шестом раунде создатели игры предлагают нам воспользоваться функциями ;-). Наивные — мы ими пользуемся уже со второго раунда. В этом раунде, как и в предыдущем, в отдельную функцию выносится наша знаменитая тройка команд — прыжок, проход и лампочка! По ситуации видно, что здесь очень удобно произвести блоки движений с разворотом направо. Таким образом, мы можем пройти 3 раза подряд. А дальше, используя эту же функцию, мы пройдем 2 раза вперед. Только, из-за постоянных разворотов, мы будем добавлять команду обратного поворота.
LightBot - скриншот прохождения шестого уровня
В седьмом уровне нет прыжков, поэтому основная функция у нас видоизменилась. Решено было использовать только лампочку и шаг, причем два раза. Ну а так — уровень очень прост для прохождения — нажимай лампочки до победного, развернись и снова нажимай. На этом уровне мы сами себе добавили изюминку и сделали в основном блоке команд вызов только одной функции, а во второй функции добавили рекурсию. И так бы функция и зациклилась бы, но выполнение робота автоматически останавливается если все платформы активированы.
LightBot - скриншот прохождения седьмого уровня
В восьмом раунде основная функция опять подверглась изменениям — теперь важно чаще идти вперед, поэтому она имеет следующие команды — шаг, прыжок, шаг, лампочка. Вроде бы прыжок здесь лишний, но если его убрать, то придется писать отдельный блок команд для первого прохода, поэтому было решено подогнать все под один шаблон. Здесь мы выносим основные, крупные блоки в отдельную функцию — проход до конца и разворот направо. Когда же у нас остаются маленькие развороты, то их мы организовываем отдельно в основном блоке команд — ну там все равно одна функция подключается.
LightBot - скриншот прохождения восьмого уровня
В 9 раунде все просто как два рубля — сначала мы поднимаемся на нашу полосу препятствий, а потом ходим и активируем платформы. Основную функцию мы опять переписываем. Теперь она у нас будет прыгать, включать лампочку, разворачиваться налево и снова прыгать. А вторая функция нам будет обеспечивать прохождение от одного подъема до следующего, а также переход в рекурсию — вызов самой себя.
LightBot - скриншот прохождения девятого уровня
Десятый уровень один из самых сложных — этот уровень я пытался просто пройти очень долго, так как не знал как можно автоматизировать прохождение. Решено было одну функцию использовать для создания пути по подходу к основной развилке, а основную логику оставить в теле программы. Думается, что этот уровень еще поддастся оптимизации, но пока остается такой вариант.
LightBot - скриншот прохождения десятого уровня
Одиннадцатое задание можно было бы еще больше подвергнуть оптимизации, но не хватило команд во второй функции. А так — ясно видно, что необходимо выполнить 3 больших похожих действия или 6 маленьких.
LightBot - скриншот прохождения одиннадцатого уровня
Прохождение последнего, двенадцатого уровня мы завершим рекурсией. Первые два хода обеспечат подход к американским горкам, а следующий код вызовет функцию, которая будет ходить по лестницам до тех пор, пока программа сама не остановит робота.
LightBot - скриншот прохождения последнего двенадцатого уровня
Ну вот и все. Все скриншоты прохождения каждого уровня представлены. Надеюсь,что информация пригодится

Ко мне пришли по этим поисковым фразам:

JohnnySuperb

Человек с разными склонностями и потребностями..

Добавить комментарий