Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 18 19 20 21 22 23 24 25 None 28 29 30 31
Caleivy
Всем привет, потратил два дня на 19 задачу Не мог решить вопрос когда с двух сторон нет выхода. В итоге все таки решил, делюсь своим примером, мб кому нибудь пригодиться, тк тут его не нашел.
Что бы немного напрячь мозг, написал код текстом по примеру py.user.next.

цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
цикл пока сверху_нет_стены выполнять
шагнуть вверх
конец цикла
если снизу_стена то
цикл пока справа_нет_стены выполнять
шагнуть вправо
конец цикла
конец если
цикл пока сверху_нет_стены выполнять
шагнуть вверх
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
конец цикла
py.user.next
Caleivy
Всем привет, потратил два дня на 19 задачу
Здесь делал эту задачу.

Caleivy
Что бы немного напрячь мозг, написал код текстом по примеру py.user.next.
Ты забыл вставить концовки везде. А представь, что пропадут отступы (движок форума их удалит или при перепосте кем-то куда-то они удалятся куда-нибудь). Вот концовки нужны как раз для того, чтобы при пропаже отступов можно было всё точно восстановить обратно, ну или хотя бы точно всё прочитать без восстановления.

Так что пишешь “цикл пока … выполнять”, после цикла ставь концовку “конец цикла”. В языке Ruby это сделано синтаксически, но там и отступов синтаксических нет, как в Python. А псевдокод всё-таки на синтаксисе жёстко не заморочен; он, наоборот, свободен по синтаксису. Поэтому мы не можем на отступы полагаться, что они будут всегда всеми участниками обмена псевдокодом сохраняться, так как они понимают, что отступы являются важным синтаксическим элементом. Они запросто могут не брать во внимание отступы, а считать это просто удобством, которое можно и не соблюдать.

А так, кто-нибудь передаст твой псевдокод дальше и сделает из него вот это, посчитав, что отступы не важны
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока сверху_нет_стены выполнять
шагнуть вверх
если снизу_нет_стены то
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока сверху_нет_стены выполнять
шагнуть вверх
цикл пока слева_нет_стены выполнять
шагнуть влево
Попробуй восстанови обратно, когда только по отступам можно было сказать, вложенный ли цикл или не вложенный. Другое дело, если там концовки есть, тогда по ним ты можешь всё точно восстановить.
Caleivy
py.user.next
Попробуй восстанови обратно, когда только по отступам можно было сказать, вложенный ли цикл или не вложенный. Другое дело, если там концовки есть, тогда по ним ты можешь всё точно восстановить.
Понял, спасибо за подсказку, исправил.

py.user.next
Здесь делал эту задачу.
Поиск на данном форуме что-то вообще не работает. Что бы не искал, ничего не находит.
Caleivy
py.user.next
Подскажи пожалуйста, как решил задачу №22, просмотрел все страницы данной ветки, так и не нашел.
У меня получилось её решить, но способ не самый быстрый, но рабочий
Особенно понравился самый конец, пришлось еще добавлять 3 строки в начало кода.

 def task_5_10():
    if (wall_is_above() and wall_is_beneath()
        and wall_is_on_the_left() and wall_is_on_the_right()):
        fill_cell()
    while not wall_is_beneath():
        while not wall_is_on_the_right():
            fill_cell()
            move_right()
            fill_cell()
        while not wall_is_on_the_left():
            move_left()
        move_down()
    while not wall_is_on_the_right():
        fill_cell()
        move_right()
        fill_cell()
    while not wall_is_on_the_left():
        move_left()
py.user.next
Caleivy
Понял, спасибо за подсказку, исправил.
Читаю твой код, он с ошибками. Один цикл не закрыт в конце. Также отступы у тебя нарушены. Цикл ты закроешь сам, тут подсказки не нужны. А вот отступы нужно делать пробелами. В профессиональных кодах отступы делают табуляциями, так как они занимают один байт, но при этом их можно настроить на любую ширину отображения у себя в редакторе (на 2 пробела, на 4 пробела, на 8 пробелов). Но делается это только в суперпрофессиональных кодах, где ты точно знаешь, что люди там не тупые сидят. Если же у тебя речь идёт о диком коде, который может попасть и к тупарю какому-нибудь, который не знает, что табуляции только всё испортят, то ты делаешь не табуляции, а пробелы. Отступ в 4 пробела нормальный. Это не много и не мало, это не 2 и не 8. При этом в любом редакторе, в любой консоли, на любом сайте типа GitHub'а и других, эти четыре пробела будут отображаться одинаково. А вот табуляции там обычно скачут так, что цикл с двумя-тремя вложенностями уезжает за край экрана и этот код надо постоянно прокручивать влево и вправо, чтобы читать его построчно. Ты просто вставляешь небольшой код с табуляциями на сайт, а после отправки он показывается с этими табуляциями шириной в 8 пробелов. А нафиг тебе эти 8 пробелов смотреть, если ты и так видишь, что там отступ есть. То есть нет такой необходимости, а умность использования табуляций тут вообще ни при чём. Если код читается херово, то не очень-то он умно оформлен.


Caleivy
Подскажи пожалуйста, как решил задачу №22, просмотрел все страницы данной ветки, так и не нашел.
Здесь делал эту задачу.

Caleivy
Поиск на данном форуме что-то вообще не работает. Что бы не искал, ничего не находит.
Поиск на всех форумах не работает. Это происходит потому, что форумы не специализируются на поиске. На форумах ты обычно ищешь через google.com или yandex.ru, используя специальную конструкцию для поиска только по одному сайту. Есть там язык поисковых запросов, который у каждой поисковой системы свой. То есть не только по словам можно искать, можно сказать “ищи только на этом сайте” или “ищи только с таким словом в адресной строке” или “ищи только файл с расширением pdf”. Индексирование всяких мест - это слишком сложная фигня, чтобы разработчики форумских движков в ней хорошо соображали. Поэтому поиск на форумах делают, но найти им практически ничего нельзя, кроме самых общих и простых текстов.
Caleivy
py.user.next
Читаю твой код, он с ошибками. Один цикл не закрыт в конце. Также отступы у тебя нарушены. Цикл ты закроешь сам, тут подсказки не нужны. А вот отступы нужно делать пробелами.
Ну там в конце просто цикл в цикле, поэтому конец поставил один. А насчет табуляции, во всех учебных материалах говорится именно про 4 пробела, поэтому всегда её и использую.
py.user.next
Caleivy
Ну там в конце просто цикл в цикле, поэтому конец поставил один.
У каждого цикла должна быть концовка, даже если в нём вообще ничего нет. Потому что человек когда читает, он не знает, что ты там думал, знаешь ли ты, как писать, или не знаешь, как писать. Все циклы имеют одну форму - заголовок + тело + концовка.

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

Зря ты думаешь, что псевдокод - это просто. Псевдокод нужно протренировывать, очень точно писать, и он точно так же, как и обычный код, должен быть без ошибок. Все отстуты должны быть правильными, все конструкции должны быть правильными. Все закрываемые конструкции должны быть закрыты.
Caleivy
py.user.next
У каждого цикла должна быть концовка, даже если в нём вообще ничего нет. Потому что человек когда читает, он не знает, что ты там думал, знаешь ли ты, как писать, или не знаешь, как писать. Все циклы имеют одну форму - заголовок + тело + концовка.
Увидел, почему то именно на форуме поставилось слишком много пробелов, там где у меня стоит 4, тут поставило 8, исправил.

py.user.next
Если ты перечитаешь свой псевдокод, то ты увидишь, что отступы у тебя вообще неправильно расставлены. А всё это происходит из-за того, что там до сих пор табуляция содержится. Поэтому ты не можешь сообразить, как его выровнять.
Я только недавно начал изучать python, до этого с программированием не связывался, поэтому ошибки допустимы. Но критика это хорошо, в дальнейшем стараешься не допускать тех же ошибок.
0ppa
Caleivy и py.user.next, у меня почти тоже самое решение для 19 задачи (половину скопипастил поэтому):
 цикл пока слева_нет_стены и сверху_есть_стена выполнять
    шагнуть влево
конец цикла
цикл пока справа_нет_стены и сверху_есть_стена выполнять
    шагнуть вправо
конец цикла
если сверху_нет_стены то
    цикл пока сверху_нет_стены выполнять
        шагнуть вверх
    конец цикла
    цикл пока слева_нет_стены выполнять
        шагнуть влево
    конец цикла
конец если

Только самое смешное, что я случайно сначала сделал 19 задачу, а потом только 18 и у меня так получилось, что решение 19 полностью подошло для 18 задачи
py.user.next
0ppa
Только самое смешное, что я случайно сначала сделал 19 задачу, а потом только 18 и у меня так получилось, что решение 19 полностью подошло для 18 задачи
Здесь делал 18-ую задачу.

0ppa
решение 19 полностью подошло для 18 задачи
Задачи в учебных курсах специально могут быть заготовлены так, чтобы показать учащемуся реюз кода и простимулировать его взять свою программу и поменять её немного, чтобы решить другую задачу, похожую на уже решённую. Это типа учебного приёма. В реальных же задачах (из реального, дикого мира) обычно всё зависит только от тебя, от твоего мастерства писать не привязанный ни к чему код. Для этого в ООП-языках (объектно-ориентированная парадигма) существуют интерфейсы, используется приём агрегации, используется полиморфизм. В СП-языках (структурная парадигма) обычно заморачиваются на ослаблении передаваемых данных. Чем проще данные, которые модули/подпрограммы передают друг другу, тем лучше. Чем свободнее условия, в которых может выполняться подпрограмма, тем лучше. Это залог реюза такого кода. Его всегда можно повернуть чуть ли не в противоположную сторону.

Если изучишь awk (текстовый транслятор в мире Linux), там увидишь это во многих местах.
[guest@localhost ~]$ echo "a aaa" | awk '{print "field1=" $1, "field2=" $2, "match=" ($2 ~ $1 "{"length($2)"}")}'
field1=a field2=aaa match=1
[guest@localhost ~]$ echo "a aaa" | awk '{print "field1=" $1, "field2=" $2, "match=" ($2 ~ $1 "{"length($2)+1"}")}'
field1=a field2=aaa match=0
[guest@localhost ~]$
В первом случае поле “aaa” пытается проматчиться с регулярным выражением “a{3}” и у него это получается. Во втором случае поле “aaa” пытается проматчиться с регулярным выражением “a{4}” и у него это не получается.
А где мы взяли регулярное выражение само? Мы его сгенерировали на лету из текста первого поля (взяв символ поля) и текста второго поля (взяв длину этого поля в символах). В других программах, типа cut и прочих, если ты и работаешь с полями, то они являются только обрабатываемым текстом. В awk же сделали так, чтобы поля могли быть и текстами, и числами одновременно, а функции внутри awk могли принимать и текст, и число. Таким образом разработчики соединили поля с внутренними функциями awk, придав ему мощь. Как же это сделано? Это сделано через убирание лишних условий для полей и убирание лишних условий для функций. Поля не обязаны быть просто текстом, а функции не обязаны принимать лишь текст или лишь число. Любая строка может превратиться в число в любое время и любое число может превратиться в строку в любое время. В данном случае не очень заметно, как вычисленная длина, возвращённая из функции length() в виде числа, превращается в строку при выполнении операции конкатенации с единственным символом поля.
$1 "{" length($2) "}" ->
"a" "{" length($2) "}" ->
"a" "{" length("aaa") "}" ->
"a" "{" 3 "}" ->
"a{" 3 "}" ->
"a{" "3" "}" ->
"a{3" "}" ->
"a{3}"
Благодаря таким возможностям, на языке awk можно писать генераторы программ на языке awk. Программа на awk может создать программу на awk. И не только на awk. Сгенерировать пачку правильно заполненных классов на Python или C++ тоже не составит труда.
[guest@localhost ~]$ echo "a" | awk '{print length(11111)}'
5
[guest@localhost ~]$
Здесь подали число в функцию length() и она не выдала ошибку, а просто преобразовала число 11111 в строку и вернула количество символов в получившейся строке. Вот в этом фишка гибкости awk. Условие подачи в length() только строки убрано и функция стала применима к куче разных данных, среди которых могут быть и числа. Когда тебе нужно определить количество цифр в числе, тебе не нужно его делить математически или приводить к строке сначала, тем самым увеличивая код.
[guest@localhost ~]$ echo "a" | awk '{print "in 11111 there are "length(11111)" digits"}'
in 11111 there are 5 digits
[guest@localhost ~]$
[guest@localhost ~]$ awk 'BEGIN {num = 11111; print "in " num " there are " length(num) " digits"}'
in 11111 there are 5 digits
[guest@localhost ~]$
[guest@localhost ~]$ awk 'BEGIN {num = 11111; print "in " num " there are " length(num) " digits" >"file_for_" num ".txt"}'
[guest@localhost ~]$ cat file_for_11111.txt
in 11111 there are 5 digits
[guest@localhost ~]$
А тут мы сформировали на лету имя файла, куда всё это выводим. Естественно, мы можем использовать и поля, и сгенерированные строки, и любые числа для формирования имён для файлов. Попробуй в програме cut это сделать - прямо из выделенного поля в процессе обработки текста сформировать имя файла для вывода этого поля в него. Программа cut не настолько гибкая, чтобы выполнить это, как раз потому, что в ней есть куча условий типа “выделенное поле можно только вывести на экран или не выводить”, “разделитель полей можно взять только из командной строки”, “разделитель полей должен быть только одним символом” и подобных. Такие условия всё больше и больше сужают применимость самой программы и сводят на нет реюз уже написанных скриптов. Если у тебя появляются многосимвольные разделители полей, то ты уже cut не можешь задействовать. А это всего лишь небольшое изменение требований.


tags: reuse
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