Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 5 6 7 8 9 10 None 28 29 30 31
rahmanoff
Спасибо всем, особенно py.user.next!
Сегодня доделал задачи из “робота”. “Иду” дальше.
Konstantin32
ребят, подскажите плз
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()


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

Ориентироваться надо по стене сверху от клетки.
Konstantin32
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()
py.user.next
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]$

Можно ещё оптимизировать алгоритм, чтобы при возвратах тоже закрашивалось.
Konstantin32
с 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
py.user.next
Задача 22
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id53

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

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

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

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

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

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

Ну в этом плане я еще неопытен, только начал изучать язык, поэтому работал скорее на результат, нежели на красивый код.
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