Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 21 22 23 24 25 26 27 28 29 30 31
Alexey_88
py.user.next
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
1. получается первый пункт относится к части кода “флаг_искать_проход := да”?
py.user.next
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде.
За это отвечает строка “флаг_искать_проход := нет”?
py.user.next
Поэтому, если робот не найдёт прохода в исследуемом ряде, он остановится у левой стены.
Ну тут вроде понятно, это описывается двумя циклами
py.user.next
цикл пока справа_нет_стены выполнять
шагнуть вправо
py.user.next
цикл пока слева_нет_стены выполнять
шагнуть влево
Сложновато конечно, но вроде понятно.. Спасибо за ответ!
py.user.next
Alexey_88
py.user.next
1. Перед входом в каждый новый (неисследованный) ряд робот помнит, что он должен найти проход в этом новом ряде.
получается первый пункт относится к части кода “флаг_искать_проход := да”?
Да, к каждой из частей. Перед входом в основной цикл (цикл обработки очередного ряда) и во внутренних циклах, в которых обнаруженный проход снова включает флаг для продолжения основного цикла (цикла обработки очередного ряда).

Alexey_88
py.user.next
2. При входе в новый (неисследованный) ряд, ещё до начала исследования ряда, робот запоминает, что он не должен искать проход в следующем новом ряде.
За это отвечает строка “флаг_искать_проход := нет”?
В этом и заключается защёлкивание. Когда мы входим в цикл по флагу, мы тут же выключаем флаг, чтобы цикл больше не продолжался. И только внутренние циклы могут включить флаг обратно. Соответственно, если они флаг не включат, то и основной цикл больше не будет продолжаться.

Alexey_88
Сложновато конечно, но вроде понятно
Сложновато, да. Но для того и нужно задачи решать в уме по типу той классической задачи про шары, которую я привёл, чтобы мозги развить для такого мышления. Алгоритмическое мышление это. И с рождения его нет, его надо развивать, прорешивая в уме задачи. Математика может помочь в этом, потому что там всё в воображении надо держать одновременно, чтобы понимать, о чём речь идёт. Но одной математики будет недостаточно. Математика лишь даёт объёмность (вместимость абстракций в сознании в единицу времени). Нужно решать именно алгоритмические задачи - составлять алгоритмы с нуля, строить их от начала до конца пошагово. Мозг привыкнет (научится) и станет строить такие цепочки всё длиннее и всё объёмнее. А без тренировок останешься плоскомыслящим, и максимум, который сможешь выжать из мозга, - какую-нибудь простую автоматизацию, где всё само по себе понятно и ничего сложного нет.
Alexey_88
py.user.next
Нужно решать именно алгоритмические задачи - составлять алгоритмы с нуля, строить их от начала до конца пошагово.
Спасибо большое! А где можно ещё поискать алгоритмические задачи, от простых к более сложным?
Ту книгу, которую вы советовали ранее “Программирование для математиков” я начал потихоньку изучать, но пока до сложных алгоритмов там не дошел.

py.user.next
Alexey_88
А где можно ещё поискать алгоритмические задачи, от простых к более сложным?
Можно найти лабораторные работы для вузов. Там будут задачи типа “выведите n совершенных чисел, где совершенное число - это то-то и то-то”. Или же там будут задачи типа “возьмите данные из файла, преобразуйте их так-то так-то и сохраните вывод в файл”. Такие, дискретные задачи, которые поэтапно идут из начальной точки в конечную, где этапы хорошо отделены друг от друга.

При этом игнорируй олимпиадные задачи. Видишь олимпиадную задачу - обходи её стороной. Они ничему не учат и вообще ничего не развивают. Они только запрашивают у тебя “а что ты умеешь уже делать?” и ты показываешь “я умею вот это и вот это”. А если ты не умеешь, то они тебя и не научат, потому что они не для этого формировались. Нужно выбирать задачи, которые учат. Поэтому вузовские задачи - это как раз те самые, которые сделаны изначально для того, чтобы студентов сделать программистами, начиная с чистого листа, с нуля.

Alexey_88
Ту книгу, которую вы советовали ранее “Программирование для математиков” я начал потихоньку изучать
Она учит делать всё через исполнители. Это важная концепция, которую необходимо освоить, впитать и использовать потом везде. Так ты сможешь строить очень сложные программы. Когда-то я так преодолел этот рубеж, когда хочешь написать программу, но вообще не можешь её написать, потому что она слишком сложная, слишком сложно устроена. И вот исполнители сделали очень большой прорыв в моём программировании так, что я написал программу, которая хоть и выглядела ужасно и непрофессионально по коду, но делала такие заковыристые вещи и делала их надёжно и без ошибок, что даже не верилось, что я написал такое. И я очень много впоследствии накачал файлов с её помощью, которые можно было докачивать в разные дни (когда файлы огромные, ты их откладываешь на потом и качаешь докачкой по несколько дней) потому, что они сохранялись с хешами в именах, которые конструировались исполнителем, отвечающим за конструирование имён для этих файлов. То есть это не просто была функция, которая возвращает подходящее имя файла, а это был настраиваемый исполнитель (настраивался он из конфигурационного файла снаружи программы), который сначала нужно было настроить, чтобы он очень тонко выдавал те или иные имена для файлов (чтобы между сотнями похожих файлов не было коллизий по именам и чтобы это не было тупо, как в Windows, file.txt, file (1).txt, file (2).txt и так далее). То есть в эту программу можно было на закачку поставить десять тысяч файлов и качать их несколько недель вразнобой, менять у них очерёдность закачки, отменять закачки, добавлять закачки в середину и при этом для всех этих десяти тысяч файлов ты мог быть стопроцентно уверен, что ничто ни с чем не перепутается и ничто никуда не потеряется и всё докачается в течение недели и переименуется и сохранится правильным образом в правильные места. Вот это мне дали исполнители всё. Они как бы взяли на себя всю сложную работу и всю ответственность за правильное выполнение задачи, которая им ставилась. Исполнители опирались на исполнители, которые опирались на исполнители, которые опирались на исполнители. Это к ООП вообще отношения не имеет, поэтому в книжках по ООП ты это всё не найдёшь. И, соответственно, изучая ООП, ты это всё уметь не будешь. Изучая ООП, ты будешь просто писать простые программки, но только в ООП. Для понтов подойдёт, а для дела - нет.
Alexey_88
Еще раз огромное спасибо за развернутый ответ. Буду двигаться дальше.
0ppa
Вижу вы тут флаги обсуждаете
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()
Подскажите, в каких задачах вы ещё флаги использовали?
py.user.next
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
xam1816
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
py.user.next
xam1816
мой вариант

вывод

aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
k
Она должна вывести j. В задании указано. Уточнил задание, чтобы путаницы не было, и дополнил его вариантом, чтобы все случаи были учтены.

Так что давайте свои решения самодельной задачи, я сейчас построю набор юнит-тестов для этой задачи и буду ваши решения прогонять по ним, чтобы убедиться, что ваши решения полные и правильные. А потом своё решение выдам.
xam1816
py.user.next
пределить в строке вторую букву (во всей строке), перед которой есть цифра
py.user.next
aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa
В этой строке первая цифра 1,далее ищем первую букву после цифры:
!#@ $,первая буква попавшаяся после цифры j,вторая k
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