спасибо, надо еще попрактиковаться в декомпозиции. но хотя бы более-менее понятно стало.
LuckerВообще, этот курс сделан по книге “Программирование для математиков” Кушниренко-Лебедев. По крайней мере парень, который ведёт лекции в МФТИ и руководит этим курсом, рассказывает пулёвую инфу из этой книги. Но в книге больше нужной инфы. В этом курсе, например, нет инвариантов и рекурсивных обходов препятствий, а в книге реально объясняется рекурсия и потом даются задания на управление путником через рекурсивные подпрограммы. А инвариант - это вообще бомба. Мне как-то помог инвариант обработать строку в программе, которую я долго не мог обработать, потому что она сликом сложная была для понимания. В этом курсе все задачки в уме решаются, а в реальном мире часто бывают задачки, которые в уме не помещаются. Когда писал реализацию алгоритма base64, тоже применил инвариант и только тогда код стал очень компактным. Потом я открыл питоновскую реализацию этого алгоритма и он оказался прямо таким же, как мой. Короче, в этой книге дают методы для составления идеальных алгоритмов - компактных, точных и максимально быстрых.
надо еще попрактиковаться в декомпозиции
def add2(point_1, point_2): new_point = gr.Point(point_2.x - point_1.x, point_2.y - point_1.y) return new_point
acceleration = update_acceleration(coords, gr.Point(400, 400)) coords2 = update_coords(coords, velocity) velocity = update_velocity(velocity, acceleration) movecoords = add2(coords, coords2) x = movecoords.getX() y = movecoords.getY() circle.move(x, y) coords = coords2 check_coords(coords, velocity)
import graphics as gr SIZE_X = 800 SIZE_Y = 800 window = gr.GraphWin("Model", SIZE_X, SIZE_Y) coords = gr.Point(400, 700) #начальное положение шарика (x, y) velocity = gr.Point(2, 0) #скорость (x, y) acceleration = gr.Point(0, 0) #ускорение def clear_window(): rectangle = gr.Rectangle(gr.Point(0, 0), gr.Point(SIZE_X, SIZE_Y)) rectangle.setFill('green') rectangle.draw(window) sun = gr.Circle(gr.Point(400, 400), 50) sun.setFill('yellow') sun.draw(window) def add(point_1, point_2): new_point = gr.Point(point_1.x + point_2.x, point_1.y + point_2.y) return new_point def sub(point_1, point_2): new_point = gr.Point(point_1.x - point_2.x, point_1.y - point_2.y) return new_point def draw_ball(coords): circle = gr.Circle(coords, 10) circle.setFill('red') circle.draw(window) def check_coords(coords, velocity): if coords.x < 0 or coords.x > SIZE_X: velocity.x = -velocity.x if coords.y < 0 or coords.y >SIZE_Y: velocity.y = -velocity.y def update_coords(coords, velocity): return add(coords, velocity) def update_velocity(velocity, acceleration): return add(velocity, acceleration) def update_acceleration(ball_coords, center_coords): diff = sub(ball_coords, center_coords) distance_2 = (diff.x ** 2 + diff.y ** 2) ** (3/2) G = 2000 return gr.Point(-diff.x*G/distance_2, -diff.y*G/distance_2) while True: clear_window() draw_ball(coords) acceleration = update_acceleration(coords, gr.Point(400, 400)) coords = update_coords(coords, velocity) velocity = update_velocity(velocity, acceleration) check_coords(coords, velocity) gr.time.sleep(0.002)
#!/usr/bin/python3 from pyrob.api import * @task(delay=0.02) def task_9_3(): c = 1 while not wall_is_on_the_right(): c += 1 move_right() else: move_left(c-1) base_sq = c base_tr = base_sq - 2 def mvr(base_sq, base_tr): while base_sq > 1: base_sq -= 1 move_right() while base_tr > 0: fill_cell() move_right() base_tr -= 1 base_sq -= 1 def mvd(base_sq, base_tr): while base_sq > 1: base_sq -= 1 move_down() while base_tr > 0: fill_cell() move_down() base_tr -= 1 base_sq -= 1 def mvl(base_sq, base_tr): while base_sq > 1: base_sq -= 1 move_left() while base_tr > 0: fill_cell() move_left() base_tr -= 1 base_sq -= 1 def mvu(base_sq, base_tr): while base_sq > 1: base_sq -= 1 move_up() while base_tr > 0: fill_cell() move_up() base_tr -= 1 base_sq -= 1 stage = 1 while stage < c: if base_sq < 2: if wall_is_beneath() and wall_is_on_the_left(): return else: while not wall_is_beneath(): move_down() while not wall_is_on_the_left(): move_left() else: mvr(base_sq, base_tr) mvd(base_sq, base_tr) mvl(base_sq, base_tr) mvu(base_sq, base_tr) base_sq -= 2 base_tr = base_sq - 2 stage += 1 move_down() move_right() if __name__ == '__main__': run_tasks()
Intarr
Задача №30: task_9_3
Закрасить поле «треугольниками». Размер поля не известен, но поле всегда квадратное с нечётным количество клеток по каждой стороне.
Intarr
Мне показалось это криворуким, вопрос, как можно решить эту задачу проще-правильнее?
#!/usr/bin/python3 from pyrob.api import * def draw_cycle(side_length): i = 0 while i < side_length - 1: if i > 0: fill_cell() move_up() else: move_up() i += 1 i = 0 while i < side_length - 1: if i > 0: fill_cell() move_right() else: move_right() i += 1 i = 0 while i < side_length - 1: if i > 0: fill_cell() move_down() else: move_down() i += 1 i = 0 while i < side_length - 1: if i > 0: fill_cell() move_left() else: move_left() i += 1 @task(delay=0.05) def task_9_3(): side_length = 1 while not wall_is_beneath(): move_down() side_length += 1 while side_length > 1: draw_cycle(side_length) move_right() move_up() side_length -= 2 while not wall_is_beneath(): move_down() while not wall_is_on_the_left(): move_left() if __name__ == '__main__': run_tasks()
def draw_cycle(side_length): for move_func in (move_up, move_right, move_down, move_left): for i in range(side_length - 1): if i > 0: fill_cell() move_func()
def up_and_fill(): move_up() fill_cell() move_down() def down_and_fill(): move_down() fill_cell() move_up() @task def task_8_10(): if not wall_is_above(): up_and_fill() if not wall_is_beneath(): down_and_fill() while not wall_is_on_the_right(): move_right() if not wall_is_above(): up_and_fill() if not wall_is_beneath(): down_and_fill()
hm_dmitry
Всем привет,
Подскажите, пожалуйста, правильно ли будет следующее решение для задачи # 13:
#!/usr/bin/python3 from pyrob.api import * def fill_up_down(): if not wall_is_above(): move_up() fill_cell() move_down() if not wall_is_beneath(): move_down() fill_cell() move_up() @task(delay=0.01) def task_8_10(): fill_up_down() while not wall_is_on_the_right(): move_right() fill_up_down() if __name__ == '__main__': run_tasks()
py.user.nextСпасибо! Теперь буду знать.
Почему мы делаем вот так, а не как у тебя
py.user.nextВот этот первый fill_up_down() пишем для проверки первой клетки, верно ?
def task_8_10():
fill_up_down()
while not wall_is_on_the_right():