Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 20 21 22 23 24 25 26 27 28 29 30 31
y_c
Задание 1_2:
http://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#o2-task-1-2

Я так понял задачу:
Необходимо закрасить (превратить в желтую) одну бирюзовую ячейку и встать на черную точку.
Исходя из этого называю “не закрашенными” именно бирюзовые ячейки.
Все остальные задачи на окрашивание ячеек я выполнил.

Я немного не правильно выразился, fill_cell() - закрашивает ячейку.
cell_is_filled() - определяет “статус” - возвращает true, если ячейка закрашена (желтая) и false, если не закрашена (бирюзовая)
Это можно проверить условием:
 @task
def task_1_2():
    if cell_is_filled():
        move_right()
    else:
        move_down()
Результатом будет движение “вниз”, т.к. ячейка “белая” и вернула значение “true” - т.е. “закрашена”.

Я сразу определился:
1. Мне нужно закрасить одну бирюзовую ячейку, следуя по пути к черной точке.
2. Закрасить ячейки без проверки не входит в условие задачи. Решение просто не будет засчитано.

Проблема в том, что fill_cell() помечает для закрашивания все ячейки по пути к цели.
0ppa
y_c
Задание 1_2:
Вы меня запутали с таким легким заданием)))) Это нужно уметь так)))
Но скажу одно только желтые клетки закрашенные)))
Наверное теперь я запутал вас больше, но вот доказательство:
 def task_1_2():
    fill_cell()
    if cell_is_filled():
        move_right()
    else:
        move_down()
y_c
0ppa
Но скажу одно только желтые клетки закрашенные
Да, верно, теперь все на своих местах - желтые являются “закрашенными”.
Но почему не закрашивается одна бирюзовая ячейка в программе?
По условию не нужно закрашивать все подряд, иначе я давно уже выполнил бы условие.
0ppa
У тебя ошибка изначально
y_c
@task
def task_1_2():
if cell_is_filled():
move_right()
else:
move_down()

Результатом будет движение “вниз”, т.к. ячейка “белая” и вернула значение “true” - т.е. “закрашена”.
if cell_is_filled(): - ты проверяешь закрашена ли ячейка, если она не желтая то тебе выдаст false
ты не будешь двигаться вправо выполнится условие иначе т.е ты идешь вниз.
В этом задании как ты видишь нет желтых клеток и ты вообще не можешь использовать if cell_is_flled тут.
Желтые клетки изначально есть в 17, 29 и 32 задаче и все, только тут сработает это условие.
0ppa
y_c
0ppa
У тебя ошибка изначально

Стоп, стоп.
Я говорю о задаче в моем первом посте:

@task
def task_1_2():
def check_fill():
if cell_is_filled() == False: # проверяем закрашена ли клетка
fill_cell()
for i in range(3):
check_fill()
move_right()
check_fill()
move_down()
move_right()

В ней есть одна бирюзовая (“не закрашенная”, как мы выяснили) ячейка, вот её я и проверяю.
“Проверить cell__is_filled().
Если ячейка не закрашена (бирюзовая, вернула False),
то закрасить (сделать желтой)
и идти дальше на черную точку.”

Белые ячейки это не закрашенные ячейки и бирюзовые это не закрашенные ячейки, что ты проверяешь условием if cell_is_filled()?
Я же написал код:


 def task_1_2():
    fill_cell() #Закрасить ячейку (сделать желтой)
    if cell_is_filled(): # если ячейка закрашена
        move_right() # двигаемся вправо
    else:
        move_down() # двигаемся вниз
Запусти его и посмотри куда пойдет робот.
py.user.next
Я сам перепутал закрашенные и незакрашенные, внёс уже поправки.

y_c
Я сразу определился:
1. Мне нужно закрасить одну бирюзовую ячейку, следуя по пути к черной точке.
2. Закрасить ячейки без проверки не входит в условие задачи. Решение просто не будет засчитано.
Вот неправильно ты понял задание. Тема этого блока заданий написана над заданиями “Просто последовательности команд”. То есть никаких проверок там не должно быть. Условия появляются только с третьего задания и тема написана “Условное выполнение”.

Задача

шагнуть вправо
шагнуть вправо
шагнуть вниз
шагнуть вниз
закрасить ячейку
шагнуть вправо
шагнуть вправо
шагнуть вниз

[guest@localhost pyrob]$ python3 task_2.py 
INFO:pyrob:Starting task task_1_2
INFO:pyrob:Task task_1_2 finished: +
INFO:pyrob:Total: 1/1
[guest@localhost pyrob]$
y_c
Да, всем спасибо, разобрался поправил у себя код.
Alexey_88
py.user.next
py.user.next
На псевдокоде рабочий код (проверял на реальном)
флаг_искать_проход := да
цикл пока флаг_искать_проход выполнять
флаг_искать_проход := нет
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
конец цикла
Здравствуйте!
Не могли бы вы объяснить алгоритм вашей программы? Я пытался сделать по-другому, но на последней строке робот зацикливается и бегает влево-вправо от одной стены к другой. Не очень понятна третья строчка, после цикла флаг_искать_проход := нет, и далее по программе где появляется флаг_искать_проход := да, тоже не ясно.
Я алгоритм себе представлял так:
робот начинает движение влево пока нет стены слева, если есть проход то двигается вниз, если нет прохода то двигается вправо до стены, если в этом случае есть проход то двигается вниз, если же прохода нет, то двигается влево до стены.
py.user.next
Alexey_88
py.user.next
Задача
флаг_искать_проход := да
цикл пока флаг_искать_проход выполнять
флаг_искать_проход := нет
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
конец цикла

Не могли бы вы объяснить алгоритм вашей программы?
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде. Поэтому, если робот не найдёт прохода в исследуемом ряде, он остановится у левой стены.
3. Но как только робот обнаруживает проход в исследуемом ряде, он сначала запоминает, что сейчас будет новый (неисследованный) ряд и в нём нужно будет искать проход, а только потом входит в этот новый (неисследованный) ряд.
4. И дальше всё повторяется, начиная с пункта 1.

Этот приём называется “защёлкивающийся флаг” или “флаг-защёлка”.

Alexey_88
Я алгоритм себе представлял так:
робот начинает движение влево пока нет стены слева, если есть проход то двигается вниз, если нет прохода то двигается вправо до стены, если в этом случае есть проход то двигается вниз, если же прохода нет, то двигается влево до стены.
Чтобы составить алгоритм, начни с последнего ряда, будто кроме него нет больше рядов.
Когда алгоритм для последнего ряда готов, добавь один ряд, чтобы теперь было два ряда со стеной между ними и одним проходом в ней.
Так ты поймёшь, что тебе нужен переход между рядами и полный перезапуск обработки нового ряда.

Почему нужен перезапуск обработки нового ряда? Потому что в новом ряде при движении вправо ты уверен, что слева от робота в стене нет проходов. А на основании чего сложилась такая уверенность, если этот ряд новый и ты слева ещё ничего не проверял? Так вот, чтобы понимать, что этот ряд новый, а не старый, это откуда-то нужно вспоминать или просто знать. Это знание можно хранить в флажке, а можно хранить в самих языковых конструкциях.

Хранение знаний в конструкциях можно наблюдать в этой задаче
Имеется 12 шаров и рычажные весы.
Известно, что один из шаров отличается по весу от остальных, при этом неизвестно, тяжелее он или легче.
Каким образом при помощи лишь трёх взвешиваний найти отличающийся шар?
Alexey_88
py.user.next
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
1. получается первый пункт относится к части кода “флаг_искать_проход := да”?
py.user.next
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде.
За это отвечает строка “флаг_искать_проход := нет”?
py.user.next
Поэтому, если робот не найдёт прохода в исследуемом ряде, он остановится у левой стены.
Ну тут вроде понятно, это описывается двумя циклами
py.user.next
цикл пока справа_нет_стены выполнять
шагнуть вправо
py.user.next
цикл пока слева_нет_стены выполнять
шагнуть влево
Сложновато конечно, но вроде понятно.. Спасибо за ответ!
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