Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 16 17 18 19 20 21 22 23 None 28 29 30 31
Nikita_PyCharm
А я сделал через рекурсию, при том в теле удобней использовать for с автовычислением.
 @task(delay=0.01)
def task_9_3():
    def far3(a,b):
        # шапка рекурсии выполняется только в перый раз
        if b == 0: # в первой рекурсии проверят количество клеток на линии.
            while wall_is_on_the_right() == False:
                move_right()
                a += 1 # в параметр "а" записывает кол_во клеток на линии
            else:
                move_left(a-1) # возвращается на начальную позицию.
        # тело рекурсии
        if a > b:
            b += 2 # с каждим циклом рекурсии количество пустых клеток на линии увеличивается на 2.
            for i in range(a - b): # верхний
                move_right()
                fill_cell()
            move_right() # смещение до угла
            for i in range(a - b): # правый
                move_down()
                fill_cell()
            move_down() # смещение до угла
            for i in range(a - b): # нижний
                move_left()
                fill_cell()
            move_left() # смещение до угла
            for i in range(a - b): # левый
                move_up()
                fill_cell()
            move_right() # смещение в право для точки начала следующей рекурсии.
            far3(a, b) # рекурсия a = длина стороны, b = количество пустых клеток на линии.
        # порковка на точку если все линии на всех плоскостях пройдены
        while wall_is_beneath() == False: # вниз до стены
            move_down()
        else:
            while wall_is_on_the_left() == False: # влево до стены
                move_left()
    far3(1,0)
if __name__ == '__main__':
    run_tasks()
Nikita_PyCharm
py.user.next
Тут два разных счётчика: n магистральный (для магистрали) и n веточный (для ветки). Эти счётчики не зависят друг от друга, считаются по отдельности. Когда веточный n вычислен, он возвращается из функции в виде числа. То есть на выходе из функции мы получаем число изначально закрашенных клеток в ветке. И это число добавляется к магистральному n.Когда ты проходишь одну ветку, в магистральном n находится сумма количества изначально закрашенных клеток на магистрали и количества изначально закрашенных клеток в пройденной ветке. Он их отдельно вычислил и сложил при выходе из ветки.Вот это выражение


Это лишнее действие поскольку в задании не предполагаются закрашенные клетки на магистрали, достаточно посчитать закрашенные клетки в ветках. Не знаю возможно мы говорим о разных версиях pyrob,
но я в соей программе вёл подсчёт только в ветках, этого достаточно для прохождения.
А за объяснение того, как передать накопленное значение в регистр, большое спасибо!
py.user.next
Nikita_PyCharm
По Задаче 32
py.user.next
Тут два разных счётчика: n магистральный (для магистрали) и n веточный (для ветки).
Это лишнее действие поскольку в задании не предполагаются закрашенные клетки на магистрали, достаточно посчитать закрашенные клетки в ветках.

Тут страница, где можно смотреть задачи (основная страница на сайте МФТИ, куда ведут все ссылки от Тимофея, пока что в ауте - 404)
https://mipt-cs.github.io/python3-2017-2018/labs/lab2.html

Задача

Задача (сайт-оригинал)

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

Дальше смотрим точный текст задания и условия в нём
Закрасить отмеченные клетки.
В регистр ax записать количество клеток, которые были закрашены ещё до того,
как робот начал двигаться. Количество и размеры коридоров не известны.
Где-то в условиях сказано, что клетки могут быть закрашены изначально только в ветках? Нет, не сказано. Это значит, что допустим случай, когда закрашенной изначально окажется любая закрашиваемая клетка, а такие есть как в ветках, так и на магистрали. Вот исходя из этого мы и принимаем решение, что включить в алгоритм, а не по тестам судим, как там всё устроено. Если вдруг Тимофей в конце добавит ещё один тест, но в котором на магистрали будет закрашена хотя бы одна клетка, то твоя программа неправильно посчитает, а моя правильно посчитает. При этом Тимофей не будет ничего нарушать, добавив этот тест, потому что никто не говорил с самого начала, что клетки могут быть только в ветках (коридорах). Вот это важный момент: смотри на условия задачи, а не на тесты, потому что условия всегда достаточны, а тесты не всегда достаточны.
grottnn
Здравствуйте. Не могу решить задачу 5 task5_2.
Вот что получилось:

    
from pyrob.api import *
x = 0
@task
def task_5_2():
    while wall_is_beneath():
        x += 1
        for i in range(x):
            move_right()
if __name__ == '__main__':
    run_tasks()
Робот совсем не двигается, не понимаю почему.
py.user.next
grottnn
Здравствуйте. Не могу решить задачу 5 task5_2.
Задача
цикл пока снизу_есть_стена выполнять
шагнуть вправо
конец цикла
[guest@localhost pyrob]$ python3 task_5.py 
INFO:pyrob:Starting task task_5_2
INFO:pyrob:Task task_5_2 finished: +
INFO:pyrob:Total: 1/1
[guest@localhost pyrob]$
grottnn
Спасибо. Оказалось проще чем думал.
Задача: 7.
def task_5_4():
while not wall_is_beneath():
move_down()
while wall_is_beneath():
move_right()
move_down()
move_left()
while wall_is_above():
move_left()
if __name__ == ‘__main__’:
run_tasks()

Здесь похоже надо посчитать шаги на право над стеной, чтобы сделать столько же на лево под ней. Не знаю как это сделать.
py.user.next
grottnn
Задача: 7.
Задача
цикл пока снизу_нет_стены выполнять
шагнуть вниз
конец цикла
цикл пока снизу_есть_стена выполнять
шагнуть вправо
конец цикла
шагнуть вниз
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
[guest@localhost pyrob]$ python3 task_7.py 
INFO:pyrob:Starting task task_5_4
INFO:pyrob:Task task_5_4 finished: +
INFO:pyrob:Total: 1/1
[guest@localhost pyrob]$

grottnn
Здесь похоже надо посчитать шаги на право над стеной
Там задачи все разбиты по темам. Надо читать тему задачи и выполнять задачу в соответствии с ней. Тема задач 5 и 7 - “Циклы с условием”. Никаких переменных там нет.
xperia
Привет.

Учусь программировать на Python.
Помогите решить задачу:
Задача №8: task_5_7. Выйти из коридора. Есть проёмы сверху или снизу.

Nikita_PyCharm
xperia
Привет. Учусь программировать на Python. Помогите решить задачу: Задача №8: task_5_7. Выйти из коридора. Есть проёмы сверху или снизу.
Там всё очень просто пишешь цикл с двумя условиями через or
1 если сверху есть стена 2 если снизу есть стена
в теле цикла пишешь move_right()
 def task_5_7():
    while wall_is_above() or wall_is_beneath():
        move_right()
xperia
Nikita_PyCharm
Большое спасибо. Получилось. Я делал так же, только добавлял оператор not и программа работала криво.

Ещё раз спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB