Форум сайта python.su
py.user.next1. получается первый пункт относится к части кода “флаг_искать_проход := да”?
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
py.user.nextЗа это отвечает строка “флаг_искать_проход := нет”?
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде.
py.user.nextНу тут вроде понятно, это описывается двумя циклами
Поэтому, если робот не найдёт прохода в исследуемом ряде, он остановится у левой стены.
py.user.next
цикл пока справа_нет_стены выполнять
шагнуть вправо
py.user.nextСложновато конечно, но вроде понятно.. Спасибо за ответ!
цикл пока слева_нет_стены выполнять
шагнуть влево
Офлайн
Alexey_88Да, к каждой из частей. Перед входом в основной цикл (цикл обработки очередного ряда) и во внутренних циклах, в которых обнаруженный проход снова включает флаг для продолжения основного цикла (цикла обработки очередного ряда).py.user.nextполучается первый пункт относится к части кода “флаг_искать_проход := да”?
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
Alexey_88В этом и заключается защёлкивание. Когда мы входим в цикл по флагу, мы тут же выключаем флаг, чтобы цикл больше не продолжался. И только внутренние циклы могут включить флаг обратно. Соответственно, если они флаг не включат, то и основной цикл больше не будет продолжаться.py.user.nextЗа это отвечает строка “флаг_искать_проход := нет”?
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде.
Alexey_88Сложновато, да. Но для того и нужно задачи решать в уме по типу той классической задачи про шары, которую я привёл, чтобы мозги развить для такого мышления. Алгоритмическое мышление это. И с рождения его нет, его надо развивать, прорешивая в уме задачи. Математика может помочь в этом, потому что там всё в воображении надо держать одновременно, чтобы понимать, о чём речь идёт. Но одной математики будет недостаточно. Математика лишь даёт объёмность (вместимость абстракций в сознании в единицу времени). Нужно решать именно алгоритмические задачи - составлять алгоритмы с нуля, строить их от начала до конца пошагово. Мозг привыкнет (научится) и станет строить такие цепочки всё длиннее и всё объёмнее. А без тренировок останешься плоскомыслящим, и максимум, который сможешь выжать из мозга, - какую-нибудь простую автоматизацию, где всё само по себе понятно и ничего сложного нет.
Сложновато конечно, но вроде понятно
Отредактировано py.user.next (Дек. 7, 2020 23:06:36)
Офлайн
py.user.nextСпасибо большое! А где можно ещё поискать алгоритмические задачи, от простых к более сложным?
Нужно решать именно алгоритмические задачи - составлять алгоритмы с нуля, строить их от начала до конца пошагово.
Офлайн
Alexey_88Можно найти лабораторные работы для вузов. Там будут задачи типа “выведите n совершенных чисел, где совершенное число - это то-то и то-то”. Или же там будут задачи типа “возьмите данные из файла, преобразуйте их так-то так-то и сохраните вывод в файл”. Такие, дискретные задачи, которые поэтапно идут из начальной точки в конечную, где этапы хорошо отделены друг от друга.
А где можно ещё поискать алгоритмические задачи, от простых к более сложным?
Alexey_88Она учит делать всё через исполнители. Это важная концепция, которую необходимо освоить, впитать и использовать потом везде. Так ты сможешь строить очень сложные программы. Когда-то я так преодолел этот рубеж, когда хочешь написать программу, но вообще не можешь её написать, потому что она слишком сложная, слишком сложно устроена. И вот исполнители сделали очень большой прорыв в моём программировании так, что я написал программу, которая хоть и выглядела ужасно и непрофессионально по коду, но делала такие заковыристые вещи и делала их надёжно и без ошибок, что даже не верилось, что я написал такое. И я очень много впоследствии накачал файлов с её помощью, которые можно было докачивать в разные дни (когда файлы огромные, ты их откладываешь на потом и качаешь докачкой по несколько дней) потому, что они сохранялись с хешами в именах, которые конструировались исполнителем, отвечающим за конструирование имён для этих файлов. То есть это не просто была функция, которая возвращает подходящее имя файла, а это был настраиваемый исполнитель (настраивался он из конфигурационного файла снаружи программы), который сначала нужно было настроить, чтобы он очень тонко выдавал те или иные имена для файлов (чтобы между сотнями похожих файлов не было коллизий по именам и чтобы это не было тупо, как в Windows, file.txt, file (1).txt, file (2).txt и так далее). То есть в эту программу можно было на закачку поставить десять тысяч файлов и качать их несколько недель вразнобой, менять у них очерёдность закачки, отменять закачки, добавлять закачки в середину и при этом для всех этих десяти тысяч файлов ты мог быть стопроцентно уверен, что ничто ни с чем не перепутается и ничто никуда не потеряется и всё докачается в течение недели и переименуется и сохранится правильным образом в правильные места. Вот это мне дали исполнители всё. Они как бы взяли на себя всю сложную работу и всю ответственность за правильное выполнение задачи, которая им ставилась. Исполнители опирались на исполнители, которые опирались на исполнители, которые опирались на исполнители. Это к ООП вообще отношения не имеет, поэтому в книжках по ООП ты это всё не найдёшь. И, соответственно, изучая ООП, ты это всё уметь не будешь. Изучая ООП, ты будешь просто писать простые программки, но только в ООП. Для понтов подойдёт, а для дела - нет.
Ту книгу, которую вы советовали ранее “Программирование для математиков” я начал потихоньку изучать
Отредактировано py.user.next (Дек. 8, 2020 17:04:18)
Офлайн
Еще раз огромное спасибо за развернутый ответ. Буду двигаться дальше.
Офлайн
Вижу вы тут флаги обсуждаете
py.user.nextну вот спустя пол года, и я решил понять как работают флаги.
На псевдокоде рабочий код (проверял на реальном)
флаг_искать_проход := да
цикл пока флаг_искать_проход выполнять
флаг_искать_проход := нет
цикл пока справа_нет_стены выполнять
шагнуть вправо
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
цикл пока слева_нет_стены выполнять
шагнуть влево
цикл пока снизу_нет_стены выполнять
шагнуть вниз
флаг_искать_проход := да
конец цикла
конец цикла
конец цикла
f_search_entrance = True while f_search_entrance: f_search_entrance = False while not wall_is_on_the_right(): move_right() while not wall_is_beneath(): move_down() f_search_entrance = True while not wall_is_on_the_left(): move_left() while not wall_is_beneath(): move_down() f_search_entrance = True
#!/usr/bin/python3 from pyrob.api import * def ci1(): global c global b if not wall_is_on_the_left(): while not wall_is_on_the_left(): move_left() if wall_is_on_the_left(): c=1 if not wall_is_beneath(): b=0 while not wall_is_beneath(): move_down() return c, b def ci2(): global b global c if not wall_is_on_the_right(): while not wall_is_on_the_right(): move_right() if wall_is_on_the_right(): b=1 if not wall_is_beneath(): c=0 while not wall_is_beneath(): move_down() return b, c @task def task_8_30(): global b global c c=0 b=0 if c==0: while c==0: ci1() if b==0: while b==0: ci2() if b==1 and c==1: while not wall_is_on_the_left(): move_left() if __name__ == '__main__': run_tasks()
Офлайн
0ppaВ этом списке задач тема флагов начинается с 27-ой задачи, но среди всех задач там только 31-ая задача флага требует.
Подскажите, в каких задачах вы ещё флаги использовали?
Задание
Вводится строка символов из букв, цифр, пробелов и знаков препинания.
Определить в строке вторую букву (во всей строке), перед которой есть цифра.
Если такой буквы нет, вывести none.
Пример 1:
Ввод
aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
Вывод
j
Пример 2:
Ввод
,;1abc bbb ccclkj!@# $lll kkk
Вывод
b
Пример 3:
Ввод
bbb ccclkj!@# $lll kkk123::@
Вывод
none
Отредактировано py.user.next (Дек. 20, 2020 22:56:14)
Офлайн
py.user.nextмой вариант
Вообще, задач на флаги можно много придумать.
def f(string): flag_find_digit = True # тумблер поиска цифры активен flag_find_first_alpha = False# тумблер поиска первой буквы не активен flag_find_second_alpha = False# тумблер поиска второй буквы не активен for s in string:# для каждого символа S в строке выполнять далее: if flag_find_digit:# если включен тумблер поиска цифры выполнять далее: switch = s.isdigit()# True если s.является числом flag_find_digit = not switch # если s число(True) переключиться в False flag_find_first_alpha = switch# переключится в True elif flag_find_first_alpha:# если флаг поиска буквы включен,выполняется код далее switch = s.isalpha() flag_find_first_alpha = not switch# если буква поиск первой буквы выключится flag_find_second_alpha = switch # поиск второй включится elif flag_find_second_alpha: if s.isalpha():# если буква return s #вернет букву print(f(input())) print(f(input()))
aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa k ,;1abc bbb ccclkj!@# $lll kkk b Process finished with exit code 0
Отредактировано xam1816 (Дек. 20, 2020 14:30:52)
Офлайн
xam1816Она должна вывести j. В задании указано. Уточнил задание, чтобы путаницы не было, и дополнил его вариантом, чтобы все случаи были учтены.
мой вариант
…
вывод
aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
k
Отредактировано py.user.next (Дек. 20, 2020 23:03:21)
Офлайн
py.user.next
пределить в строке вторую букву (во всей строке), перед которой есть цифра
py.user.nextВ этой строке первая цифра 1,далее ищем первую букву после цифры:
aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
Офлайн