Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2019 14:48:16

rahmanoff
Зарегистрирован: 2019-09-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Спасибо всем, особенно py.user.next!
Сегодня доделал задачи из “робота”. “Иду” дальше.

Офлайн

#2 Окт. 27, 2019 22:23:25

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

ребят, подскажите плз
http://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id38
по этой ссылке задача про робота. Нужно закрасить бирюзовые клетки, но не трогать белые
вот собственно код

while wall_is_on_the_right()==False: #пока не уперся в стену
if cell_is_filled()==True: #если клетка закрашена - пропустить
move_right()
else:
fill_cell() #если не закрашена - закрасить и продолжить
move_right()


почему он у меня все подряд красит???

Офлайн

#3 Окт. 27, 2019 22:37:49

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

все, разобрался. Как оказалось, подвох в стенах почему-то, а не в краске

Офлайн

#4 Окт. 28, 2019 09:12:31

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

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

Konstantin32
ребят, подскажите плз
http://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id38
по этой ссылке задача про робота. Нужно закрасить бирюзовые клетки, но не трогать белые
Konstantin32
Как оказалось, подвох в стенах почему-то, а не в краске
Здесь задача id39. Почти такая же.

Ориентироваться надо по стене сверху от клетки.



Отредактировано py.user.next (Окт. 28, 2019 09:13:36)

Офлайн

#5 Окт. 28, 2019 22:13:16

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

rahmanoff
а я с 22 задачей промахался полдня. Решить решил, но такой вопрос: нельзя ли как-то сократить код? Не считая принтов, конечно

 n=0
m=0
while True:
	n+=1
	for i in range(n):
		while not wall_is_on_the_right():
			fill_cell()
			move_right()
	fill_cell()
	if not wall_is_beneath():	
		move_down()
	else:
		break
	print('n=',n)
	m+=1
	for i in range(m):
		while not wall_is_on_the_left():
			fill_cell()
			move_left()
	print('m=',m)
	fill_cell()
	if not wall_is_beneath():	
		move_down()
	else:
		break
	
	
if n>m:
	while not wall_is_on_the_left():
		move_left()
elif n==m:
	fill_cell()

Отредактировано Konstantin32 (Окт. 28, 2019 22:16:37)

Офлайн

#6 Окт. 29, 2019 04:28:21

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

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

Konstantin32
а я с 22 задачей промахался полдня. Решить решил, но такой вопрос: нельзя ли как-то сократить код?
Задача 22
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id53

Прямой способ
закрасить ячейку
цикл пока справа_нет_стены выполнять
шагнуть вправо
закрасить ячейку
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
цикл пока снизу_нет_стены выполнять
шагнуть вниз
закрасить ячейку
цикл пока справа_нет_стены выполнять
шагнуть вправо
закрасить ячейку
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
конец цикла
[guest@localhost pyrob]$ python3 task_22.py 
INFO:pyrob:Starting task task_5_10
INFO:pyrob:Task task_5_10 finished: +
INFO:pyrob:Total: 1/1
[guest@localhost pyrob]$

Можно ещё оптимизировать алгоритм, чтобы при возвратах тоже закрашивалось.



Отредактировано py.user.next (Окт. 29, 2019 04:29:59)

Офлайн

#7 Окт. 29, 2019 21:17:06

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

с 26 вышло вот так
как-то длинновато получилось. Есть идеи, как сократить? Кроме этого варианта и варианта удалить crosses(), разделив код между левым и правым кроссами, ничего в голову не идет

 def cross_to_right():
	move_right()
	fill_cell()
	move_down()
	fill_cell()
	move_right()
	fill_cell()
	move_left()
	move_down()
	fill_cell()
	move_up()
	move_left()
	fill_cell()
	move_right(2)
	move_up()
def cross_to_left():
	move_left()
	fill_cell()
	move_down()
	fill_cell()
	move_left()
	fill_cell()
	move_right()
	move_down()
	fill_cell()
	move_up()
	move_right()
	fill_cell()
	move_left(2)
	move_up()
	
def crosses():
	n=1
	cross_to_right()
	for i in range(n):
		while n<10:
			move_right(2)
			cross_to_right()
			n+=1
	move_down(4)
        n=1
	cross_to_left()
	for i in range(n):
		while n<10:
			move_left(2)
			cross_to_left()
			n+=1
	move_down(4)
	
@task(delay=0.01)
def task_2_4():
	crosses()
	crosses()
	n=1
	cross_to_right()
	for i in range(n):
		while n<10:
			move_right(2)
			cross_to_right()
			n+=1
	while not wall_is_on_the_left():
		move_left()

Отредактировано Konstantin32 (Окт. 29, 2019 21:22:12)

Офлайн

#8 Окт. 29, 2019 21:36:58

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next

Задача 22
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id53

Прямой способ

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

Офлайн

#9 Окт. 30, 2019 04:05:08

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

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

Konstantin32
В таком случае он каждую строку проходит по два раза.
Так я и написал в сообщении
py.user.next
Можно ещё оптимизировать алгоритм, чтобы при возвратах тоже закрашивалось.
Просто при обучении надо оба способа реализовать, потому что каждый из них имеет свои плюсы и свои минусы.

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

Konstantin32
В моем варианте дважды проходится только последняя строка
А в твоём варианте используется вообще лишняя переменная. То есть вот эти все n, m, range() и прочие вещи надо удалить. Ну, потому что они тратят память, запутывают код в плане чтения и, если блок-схему составишь для своей программы, они её тоже изрядно загрязнят.



Отредактировано py.user.next (Окт. 30, 2019 04:07:11)

Офлайн

#10 Окт. 30, 2019 18:02:19

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

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

А в твоём варианте используется вообще лишняя переменная. То есть вот эти все n, m, range() и прочие вещи надо удалить. Ну, потому что они тратят память, запутывают код в плане чтения и, если блок-схему составишь для своей программы, они её тоже изрядно загрязнят.

Насчет лишней переменной в курсе, чуть позже решил через одну n.

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

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version