Практика: Робот



Робот

Введение

В этой работе вам предстоит управлять учебным графическим исполнителем "Робот".

Робот живёт на прямоугольном клеточном поле, по периметру огороженном стенами. Между клетками тоже могут встречаться стены.

Возможные состояния клетки:

  • пустая;
  • помечена для закрашивания;
  • закрашена.
  • клетка, отмеченная чёрной точкой, куда робот должен прийти после выполнения алгоритма.

Команды робота

Команда Описание
move_left(n=1) Пройти n клеток влево (по умолчанию n = 1)
move_right(n=1) Пройти n клеток вправо (по умолчанию n = 1)
move_up(n=1) Пройти n клеток вверх (по умолчанию n = 1)
move_down(n=1) Пройти n клеток вниз (по умолчанию n = 1)
wall_is_above() если сверху стена, возвращает True, иначе — False
wall_is_beneath() если снизу стена, возвращает True, иначе — False
wall_is_on_the_left() если слева стена, возвращает True, иначе — False
wall_is_on_the_right() если справа стена, возвращает True, иначе — False
fill_cell() Закрасить текущую клетку
cell_is_filled() Возвращает True, если текущая клетка закрашена
mov(r, v) Поместить значение v в регистр r

Как запустить Робота

Скачайте и разархивируйте файлы Робота в любое место в своей домашней папке.

Увидеть условие первой задачи можно, запустив в этой папке из консоли

python3 task_1.py

Решение пишется прямо в файл task_1.py, который можно открыть любым текстовым редактором (например, gedit или PyCharm).

Для быстрой самопроверки ваших решений в этой папке есть файл all_tasks.py, который запустит все программы подряд и проверит их корректность.

Как решать задачи для Робота

Для решения каждой задачи, если больше ничего не сказано, требуется выполнить условия:

  • закончить выполнение в клетке с чёрной точкой;
  • закрасить все бирюзовые клетки;
  • ни разу не врезаться в стену.

В итоге Робот может оказаться в одном из четырёх состояний.

Состояние №1: задача решена
#!/usr/bin/python3

from pyrob.api import *


@task
def example1():

    for i in range(9):
        move_right()
        move_down()


if __name__ == '__main__':
    run_tasks()
Состояние №2: задача не решена, завершение штатное
#!/usr/bin/python3

from pyrob.api import *


@task
def example1():

    for i in range(4):
        move_right()
        move_down()


if __name__ == '__main__':
    run_tasks()
Состояние №3: ошибка времени выполнения
#!/usr/bin/python3

from pyrob.api import *


@task
def example1():

    for i in range(9):
        move_right()
        move_down()

        if i == 6:
            z = 1 / 0


if __name__ == '__main__':
    run_tasks()
Состояние №4: робот врезался в стену
#!/usr/bin/python3

from pyrob.api import *


@task
def example1():

    for i in range(10):
        move_right()
        move_down()

if __name__ == '__main__':
    run_tasks()

Просто последовательности команд

Задача №1: task_1_1

Дойти до конечной точки.

Задача №2: task_1_2

Дойти до конечной точки, закрасить одну клетку.

Условное исполнение

Задача №3: task_3_1

Дойти до стены. Расстояние до стены не известно.

Задача №4: task_3_3

С трёх сторон стены. Выйти в свободную сторону. Положение выхода не известно.

Циклы с условием

Задача №5: task_5_2

Дойти до конца стены. Расстояние не известно.

Задача №6: task_5_3

Дойти до конца стены. Расстояние не известно.

Задача №7: task_5_4

Обойти стену. Размеры стены и расстояние до неё неизвестны. Стена одна.

Задача №8: task_5_7

Выйти из коридора. Есть проёмы сверху или снизу.

Условные действия на каждой итерации цикла

Задача №9: task_8_2

Закрасить клетки. Расстояние до стены не известно.

Задача №10: task_8_3

Закрасить клетки. Расстояние до стены не известно.

Задача №11: task_8_4

Закрасить клетки. Расстояние до стены не известно.

Задача №12: task_8_6

Закрасить клетки. Расстояние до стены не известно.

Задача №13: task_8_10

Закрасить клетки. Расстояние до стены не известно.

Задача №14: task_8_11

Закрасить клетки. Расстояние до стены не известно.

Циклы, вложенные в условия

Задача №15: task_8_21

Перейти в противоположный угол. В начальный момент робот находится в углу, но не известно, в каком.

Задача №16: task_8_22

Дойти до конца тупика. Тупик имеет форму буквы Г (влево или вправо). Размеры тупика не известны.

Задача №17: task_8_27

Перейти на вторую закрашенную клетку. Клетка может быть как справа, так и слева.

Задача №18: task_8_28

Выйти из ловушки. Где находится выход, не известно.

Задача №19: task_8_29

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

Вложенные циклы

Задача №20: task_4_3

Закрасить отмеченные клетки.

Задача №21: task_4_11

Закрасить отмеченные клетки.

Задача №22: task_5_10

Закрасить всё поле. Размеры поля неизвестны.

Задача №23: task_6_6

Закрасить коридоры и вернуться. Количество и длины коридоров не известны.

Создание и использование подпрограмм

Задача №24: task_2_1

Закрасить клетки.

Задача №25: task_2_2

Закрасить клетки.

Задача №26: task_2_4

Закрасить клетки.

Использование переменных-флагов и переменных-счётчиков

Обратите внимание на то, что в этих задачах ситуативное поведение Робота не может решить задачу. В задачах требуется запомнить состояние или посчитать количество определённых клеток. Используйте для этого переменные.

Задача №27: task_7_5

Закрасить клетки с увеличивающимся интервалом. Расстояние до стены не известно.

Задача №28: task_7_6

Остановится на пятой закрашенной клетке. Количество закрашенных клеток не известно, но точно больше пяти.

Задача №29: task_7_7

Остановится на третьей подряд закрашенной клетке. Если нет трёх подряд закрашенных клеток, то остановиться у правой стены. Расстояние до стены не известно.

Задача №30: task_9_3

Закрасить поле «треугольниками». Размер поля не известен, но поле всегда квадратное с нечётным количество клеток по каждой стороне.

Задача №31: task_8_30

Добраться до нижнего уровня. Количество уровней не известно. Расстояние между стенами не известно. В каждой стене точно есть ровно один проём.

Задача №32: task_8_18

Закрасить отмеченные клетки. В регистр ax записать количество клеток, которые были закрашены ещё до того, как робот начал двигаться. Количество и размеры коридоров не известны.