Форум сайта python.su
Спасибо всем, особенно py.user.next!
Сегодня доделал задачи из “робота”. “Иду” дальше.
Офлайн
ребят, подскажите плз
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
ребят, подскажите плз
http://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id38
по этой ссылке задача про робота. Нужно закрасить бирюзовые клетки, но не трогать белые
Konstantin32Здесь задача id39. Почти такая же.
Как оказалось, подвох в стенах почему-то, а не в краске
Отредактировано py.user.next (Окт. 28, 2019 09:13:36)
Офлайн
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)
Офлайн
Konstantin32Задача 22
а я с 22 задачей промахался полдня. Решить решил, но такой вопрос: нельзя ли как-то сократить код?
закрасить ячейку
цикл пока справа_нет_стены выполнять
шагнуть вправо
закрасить ячейку
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
цикл пока снизу_нет_стены выполнять
шагнуть вниз
закрасить ячейку
цикл пока справа_нет_стены выполнять
шагнуть вправо
закрасить ячейку
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
конец цикла
[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)
Офлайн
с 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)
Офлайн
py.user.next
Задача 22
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id53
Прямой способ
Офлайн
Konstantin32Так я и написал в сообщении
В таком случае он каждую строку проходит по два раза.
py.user.nextПросто при обучении надо оба способа реализовать, потому что каждый из них имеет свои плюсы и свои минусы.
Можно ещё оптимизировать алгоритм, чтобы при возвратах тоже закрашивалось.
Konstantin32А в твоём варианте используется вообще лишняя переменная. То есть вот эти все n, m, range() и прочие вещи надо удалить. Ну, потому что они тратят память, запутывают код в плане чтения и, если блок-схему составишь для своей программы, они её тоже изрядно загрязнят.
В моем варианте дважды проходится только последняя строка
Отредактировано py.user.next (Окт. 30, 2019 04:07:11)
Офлайн
А в твоём варианте используется вообще лишняя переменная. То есть вот эти все n, m, range() и прочие вещи надо удалить. Ну, потому что они тратят память, запутывают код в плане чтения и, если блок-схему составишь для своей программы, они её тоже изрядно загрязнят.
Например, в моём варианте есть такой плюс, что можно легко выделить подпрограмму “закрасить ряд”. При этом эта подпрограмма у меня уже где-то там есть; я это просто помню. Я помню, что когда-то давно, месяца два назад, я уже закрашивал ряд в одном из этих заданий курса и делал для этого подпрограмму. Поэтому я просто могу найти код той подпрограммы в готовом виде и скопировать его из той задачи в эту и закрашивать ряд, где захочу.
Офлайн