Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 5 6 7 None 28 29 30 31
py.user.next
hm_dmitry
Вот этот первый fill_up_down() пишем для проверки первой клетки, верно ?
В данном цикле реализован метод итераций.

Метод итераций строится на трёх понятиях: M, P, T.
M - множество элементов цикла
P - предикат выхода из цикла
T - преобразование шага цикла

Тут теория из книжки Кушниренко-Лебедева “Программирование для математиков”
Метод итераций:
M - некоторое множество
P: M -> {да, нет} - предикат на M, отображающий M на да и нет
M \ P = {x прин. M: P(x) = нет} - множество элементов x прин. M, для которых P(x) = нет
Т: M \ P -> M - некоторое преобразование
Начиная с x0 прин. M, x1 = T(x0), x2 = T(x1), ..., xn = T(xn - 1), ...
Требуется найти элемент xi прин. M, такой что P(xi) = да.
Для решения одной и той же задачи можно совершенно по-разному выбирать M, P и T до написания программы.
То есть можно несколько разных правильных циклов написать для решения одной и той же задачи.

hm_dmitry
Возможно ли все это дело вписать внутрь while ?
Сначала мы делаем так:
1) В качестве множества M мы берём множество всех клеток в ряде;
2) В качестве предиката P(m) мы берём вопрос о клетке “является ли клетка m закрашенной сверху/снизу и последней в ряде?”;
3) В качестве преобразования T(m) мы берём шаг на следующую от m клетку справа и закрашивания пространства над и под ней.

Дальше мы задаёмся вопросом “что будет, если во множестве M будет одна клетка?”, ответ - будет отказ из-за невозможности выполнить шаг вправо при преобразовании T, так как первая клетка не закрашена и P(m) даст ложь. Если же мы её закрасим, то произойдёт выход из цикла, так как P(m) даст истину.

Поэтому устанавливаем m0 = закрашенная клетка
T(m0) = m1, где m1 - закрашенная клетка
T(m1) = m2, где m2 - закрашенная клетка

T(m n-1) = m n, где m n - закрашенная клетка, а P(m n) = да

Мы могли бы выбрать другие M, P и T, где преобразование T(m) сначала бы всё закрашивало для клетки m, а потом переходило вправо, а P(m) проверяло бы не является ли текущая клетка последней в ряде. Но тогда нужно было бы закрашивать последнюю клетку сверху/снизу после цикла, потому что цикл бы заканчивался на незакрашенной клетке.

Что лучше, такой вариант или такой, определяется тем, как можно разные алгоритмы присоединять друг к другу. При тех M, P и T, которые я выбрал, мы в конце цикла получаем возможность делать дальше что угодно (возвращаться влево к началу строки, переходить на следующую строку вниз и так далее). Если же закончить цикл на недокрашенной клетке, то после цикла ты не можешь никуда переходить, а должен сначала всё докрасить и только потом переходить.

Просто представь, что таких рядов, которые нужно обработать, не один, а десяток друг под другом. В таком случае первый вариант выбранных M, P и T предпочтительнее, так как после окончания цикла ты свободен для любых следующих действий.
wergon
Добрый день. Решил освоить Python, столкнулся с задачей 5_10. Вроде решил, но выглядит как-то аляповато и не покидает ощущение, что можно решить проще.
 n = 1
nn = 1
if not wall_is_on_the_right():
        while not wall_is_on_the_right():
            n += 1
            move_right()
            if wall_is_on_the_right():
                move_left(n-1)
                break
if not wall_is_beneath():
        while not wall_is_beneath():
            nn += 1
            move_down()
            if wall_is_beneath():
                move_up(nn-1)
                break
for i in range(nn):
        fill_cell()
        while not wall_is_on_the_right():
            fill_cell()
            move_right()
            fill_cell()
        if i < nn-1:
            move_down()
        for i in range(n-1):
            move_left()
py.user.next
wergon
Решил освоить Python, столкнулся с задачей 5_10. Вроде решил, но выглядит
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#o22-task-5-10

Тебе просто надо закрасить всё поле. Зачем тебе счётчики?

Ты просто должен двигаться вправо и закрашивать каждую клетку, в которой оказываешься, пока не дойдёшь до стены.
Потом просто возвращаться обратно, пока не дойдёшь до стены.
Потом шагнуть вниз, если это возможно.
А потом повторить всё то же самое.

Получается такой псевдокод:
закрасить ряд
цикл пока внизу свободно выполнять
шагнуть вниз
закрасить ряд
конец цикла

Псевдокод для “закрасить ряд”:
закрасить клетку
цикл пока справа свободно выполнять
шагнуть вправо
закрасить клетку
конец цикла
цикл пока слева свободно выполнять
шагнуть влево
конец цикла

Важно понимать, что ряд может один быть. Поэтому мы сначала закрашиваем первый ряд, а потом запускаем цикл для других рядов. Также в ряде может быть только одна клетка, поэтому при закрашивании ряда мы сначала закрашиваем первую клетку, а потом запускаем цикл для других клеток.
wergon
py.user.next
Тебе просто надо закрасить всё поле. Зачем тебе счётчики?
Это было первое, что пришло в голову, интересно было реализовать.
py.user.next
Ты просто должен двигаться вправо и закрашивать каждую клетку, в которой оказываешься, пока не дойдёшь до стены.
Потом просто возвращаться обратно, пока не дойдёшь до стены.
Потом шагнуть вниз, если это возможно.
А потом повторить всё то же самое.
Получилось, спасибо
IgorBurenko
Intarr
Добрый день! выполняю задачку из этого курсаhttp://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#o30-task-9-3Задача №30: task_9_3Закрасить поле «треугольниками». Размер поля не известен, но поле всегда квадратное с нечётным количество клеток по каждой стороне.написал такой код который работает и выполняет задачу:

я вот так решил.
 #!/usr/bin/python3
from pyrob.api import *
@task(delay=0.01)
def task_9_3():
    counter = count_rows()
    while counter > 1:
        filling_cells(counter)
        counter -= 2
    parking()
    
def filling_cells(counter):
    for i in range(counter-2):
        move_down()
        fill_cell()
    move_down()
    for i in range(counter-2):
        move_left()
        fill_cell()
    move_left()
    for i in range(counter-2):
        move_up()
        fill_cell()
    move_up()
    for i in range(counter-2):
        move_right()
        fill_cell()
    move_down()
    
def parking():
    while not wall_is_beneath():
        move_down()
    while not wall_is_on_the_left():
        move_left()
        
def count_rows():
    counter = 1
    while not wall_is_on_the_right():
        move_right()
        counter += 1
    return counter
if __name__ == '__main__':
    run_tasks()
NakiriEri

Господа, возник вопрос, как правильно и коротко выполнить это задание, ибо я вижу, что нужно делать так.
Начало цикла
фор рендж по клеткам(27)
двигаться вправо()
красить()

двигаться вниз()
фор ренджи по клеткам(27)
двигаться влево()
красить()

и .т.д пока не закрашу все, и для этого нужно будет написать 12 рядов, оч муторно, а делать до стены проблемно ибо надо закрасить только предпоследнею клетку, есть ли возможность сделать, до стены-1
или как правильно выполнить это задание, ибо мой вариант на много строк.
wergon
NakiriEri
Господа, возник вопрос, как правильно и коротко выполнить это задание, ибо я вижу, что нужно делать так. Начало цикла
У меня получилось вот так. Замысел в том, что мы 6 раз выполняем одни и те же команды, а именно закрашивание 27 клеток слева направо, шаг вниз и справа налево, шаг вниз.
 for i in range(6):
        for j in range(27):
            move_right()
            fill_cell()
        move_down()
        for d in range(27):
            fill_cell()
            move_left()
        move_down()
 move_right()    
py.user.next
IgorBurenko
я вот так решил.
  
#!/usr/bin/python3
from pyrob.api import *
@task(delay=0.01)
def task_9_3():
Можно ещё выйти в центр и начать закрашивать оттуда наружу, всё время оказываясь в левом нижнем углу в конце процедуры. И делать это можно, пока слева нет стены.

NakiriEri
Господа, возник вопрос, как правильно и коротко выполнить это задание, ибо я вижу, что нужно делать так.
Начало цикла
фор рендж по клеткам(27)
двигаться вправо()
красить()
https://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html#id51
Тут нужно вообще без чисел обойтись. Почему без чисел - потому что задача одна, а программа пишется для решения сотен задач. В разных задачах размеры поля будут меняться и вверх, и вниз. Поля будут становиться как больше, так и меньше. И вот твоя задача - написать одну программу для них для всех. Поэтому числа здесь не подходят, ты должен ориентироваться только по стенам, так как стены никогда не пропадут с поля.

И псевдокод тоже нужно правильно писать. У тебя псевдокод включает питоновские конструкции (включает детали), такого быть не должно. Псевдокод - это непростая вещь, его тоже нужно изучать. Он бывает разных видов, разного уровня общности (бывает очень общий, бывает очень детальный). В основном псевдокод пишется так, чтобы с него можно было переписать алгоритм на любой язык программирования. Поэтому, если в языке нет конструкции for для циклов, то что ты собрался записывать из этого псевдокода на этом конкретном языке? Псевдокод должен быть таким, чтобы убрать синтаксические детали языка и сконцентрироваться на алгоритме. Нет никакого for'а, нет никакого range'а, есть только какой-то абстрактный цикл, и вот этот цикл может зависеть от числа, а может зависеть от истинности условия. Всё, на любом языке ты можешь такой цикл записать, а for и range ты можешь встретить только в питоне. И те, кто не знает питон, они тебя не поймут, не поймут твой псевдокод.
NakiriEri
py.user.next
Тут нужно вообще без чисел обойтись
Но у нас робот умеет только проверять есть ли стена перед движением, и возвращать булевое значение,
а в данной задачи нужно сделать так, чтобы заканчивало красить когда до стены еще 1 клетка, т,е как имея данные команды без конкретных цифр реализовать данную программу.
py.user.next
NakiriEri
Но у нас робот умеет только проверять есть ли стена перед движением, и возвращать булевое значение,
а в данной задачи нужно сделать так, чтобы заканчивало красить когда до стены еще 1 клетка, т,е как имея данные команды без конкретных цифр реализовать данную программу.
Я написал в pyrob'е без цифр. Не выкладываю решение, так как выкладывание готовых решений учит меньше, чем выполнение заданий своими силами.

Псевдокод такой:
программа ряд подходит для закраски : да/нет
шагнуть вниз
если внизу нет стены то
шагнуть вверх
ответ := да
иначе
шагнуть вверх
ответ := нет
конец если
конец программы

программа закрасить ряд
цикл пока справа нет стены выполнять
закрасить клетку
шагнуть вправо
конец цикла
цикл пока слева нет стены выполнять
шагнуть влево
конец цикла
шагнуть вправо
конец программы

шагнуть вправо
цикл пока ряд подходит для закраски выполнять
закрасить ряд
шагнуть вниз
конец цикла
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