Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2020 13:35:47

y_c
Зарегистрирован: 2020-10-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Задание 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() помечает для закрашивания все ячейки по пути к цели.

Отредактировано y_c (Окт. 23, 2020 14:41:17)

Прикреплённый файлы:
attachment test_fill_true.jpg (36,7 KБ)

Офлайн

#2 Окт. 23, 2020 14:35:22

0ppa
Зарегистрирован: 2020-08-12
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

y_c
Задание 1_2:
Вы меня запутали с таким легким заданием)))) Это нужно уметь так)))
Но скажу одно только желтые клетки закрашенные)))
Наверное теперь я запутал вас больше, но вот доказательство:
 def task_1_2():
    fill_cell()
    if cell_is_filled():
        move_right()
    else:
        move_down()

Офлайн

#3 Окт. 23, 2020 14:38:58

y_c
Зарегистрирован: 2020-10-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

0ppa
Но скажу одно только желтые клетки закрашенные
Да, верно, теперь все на своих местах - желтые являются “закрашенными”.
Но почему не закрашивается одна бирюзовая ячейка в программе?
По условию не нужно закрашивать все подряд, иначе я давно уже выполнил бы условие.

Отредактировано y_c (Окт. 23, 2020 14:40:01)

Офлайн

#4 Окт. 23, 2020 14:49:43

0ppa
Зарегистрирован: 2020-08-12
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

У тебя ошибка изначально

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 (Окт. 23, 2020 14:53:27)

Офлайн

#5 Окт. 23, 2020 15:07:07

0ppa
Зарегистрирован: 2020-08-12
Сообщения: 18
Репутация: +  1  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

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() # двигаемся вниз
Запусти его и посмотри куда пойдет робот.

Отредактировано 0ppa (Окт. 23, 2020 15:14:02)

Офлайн

#6 Окт. 23, 2020 16:16:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Я сам перепутал закрашенные и незакрашенные, внёс уже поправки.

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]$



Отредактировано py.user.next (Окт. 23, 2020 16:19:07)

Офлайн

#7 Окт. 23, 2020 18:50:32

y_c
Зарегистрирован: 2020-10-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Да, всем спасибо, разобрался поправил у себя код.

Офлайн

#8 Дек. 6, 2020 14:40:21

Alexey_88
Зарегистрирован: 2020-12-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

py.user.next
py.user.next
На псевдокоде рабочий код (проверял на реальном)
флаг_искать_проход := да
цикл пока флаг_искать_проход выполнять
флаг_искать_проход := нет
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
конец цикла
Здравствуйте!
Не могли бы вы объяснить алгоритм вашей программы? Я пытался сделать по-другому, но на последней строке робот зацикливается и бегает влево-вправо от одной стены к другой. Не очень понятна третья строчка, после цикла флаг_искать_проход := нет, и далее по программе где появляется флаг_искать_проход := да, тоже не ясно.
Я алгоритм себе представлял так:
робот начинает движение влево пока нет стены слева, если есть проход то двигается вниз, если нет прохода то двигается вправо до стены, если в этом случае есть проход то двигается вниз, если же прохода нет, то двигается влево до стены.

Офлайн

#9 Дек. 7, 2020 00:02:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Alexey_88
py.user.next
Задача
флаг_искать_проход := да
цикл пока флаг_искать_проход выполнять
флаг_искать_проход := нет
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
конец цикла

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

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

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

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

Хранение знаний в конструкциях можно наблюдать в этой задаче
Имеется 12 шаров и рычажные весы.
Известно, что один из шаров отличается по весу от остальных, при этом неизвестно, тяжелее он или легче.
Каким образом при помощи лишь трёх взвешиваний найти отличающийся шар?



Отредактировано py.user.next (Дек. 7, 2020 07:59:37)

Офлайн

#10 Дек. 7, 2020 17:12:10

Alexey_88
Зарегистрирован: 2020-12-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version