Уведомления

Группа в Telegram: присоединиться

#1 Окт. 30, 2019 19:23:32

Konstantin32
Зарегистрирован: 2019-10-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

py.user.next
а по 30 задаче нет какой-нибудь подсказки? Я уже находил ваше решение выше, но вообще ничего не понял. Нельзя ли как-то подробнее объяснить? И, если это возможно, подскажите какую-нибудь литературу для более подробного изучения программирования в целом, а не только Python

Отредактировано Konstantin32 (Окт. 30, 2019 21:08:48)

Офлайн

#2 Окт. 31, 2019 03:27:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6539
Репутация: +  580  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Konstantin32
а по 30 задаче нет какой-нибудь подсказки?
Здесь делал.
Ну там просто идёшь кругами от краёв поля к центру поля. Обрабатываешь самый внешний круг, потом сужаешься и обрабатываешь круг внутри. Потом снова сужаешься и обрабатываешь круг внутри. И так далее, пока не дойдёшь до самого маленького круга. Процедура обработки каждого круга одна и та же.

Konstantin32
И, если это возможно, подскажите какую-нибудь литературу для более подробного изучения программирования в целом, а не только Python
Ну, этот курс у Тимофея из МФТИ как раз и есть для новичков. Я просто к тому, что если тебе дать какую-нибудь книгу по программированию, где объясняется, как можно много чего делать по-умному, ты её просто не поймёшь. Программирование - это сложная многоступенчатая фигня, где на сложных уровнях нужно знать уже весь материал простых уровней. Это как в математике: если умножать числа не умеешь, то и решать уравнения не сможешь, так как там постоянно нужно умножать; при этом умножение чисел тоже не за один день осваивается; это планомерная систематическая работа. А что касается программирования, тут тоже нужна подготовительная работа типа прохождения сначала какого-нибудь простенького курса или даже нескольких простеньких курсов, потом прохождение курса посложнее или нескольких таких курсов посложнее, а потом уже можно добраться до прохождения сложного курса, в результате прохождения которого ты и получишь первые ощутимые результаты.

Так что для новичков я тут (в этом многостраничном топике) всё давал уже. Если ты его прочитаешь с начала, то ты найдёшь множество сообщений о том, где учиться и как учиться.
Здесь писал про курс, из которого приходят задачи в этот топик.
Здесь писал про программирование.



Отредактировано py.user.next (Окт. 31, 2019 03:28:57)

Офлайн

#3 Ноя. 10, 2019 20:25:17

virgiliys
Зарегистрирован: 2019-11-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Доброго времени суток! Вопрос по 27 задаче. Выше почитал решение и рекомендацию по поводу блок схемы. В принципе я сам дошёл до того что надо использовать два счётчика и смог сделать так чтобы робот красил нужные клетки, но он у меня постоянно врезался в стену.
Решение и блок схема понятны, непонятно с какой стороны надо начинать думать чтоб до этого дойти

Офлайн

#4 Ноя. 10, 2019 23:56:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6539
Репутация: +  580  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

virgiliys
В принципе я сам дошёл до того что надо использовать два счётчика и смог сделать так чтобы робот красил нужные клетки, но он у меня постоянно врезался в стену.

virgiliys
Решение и блок схема понятны, непонятно с какой стороны надо начинать думать чтоб до этого дойти
Как составить алгоритм:
1. Написать словесное описание алгоритма.
2. По словесному описанию из первого пункта нарисовать точную блок-схему. Отлаживать её, пока она не станет оптимальной. Если она получилась сразу запутанной, то надо вернуться на первый пункт и переделать его; затем снова перейти ко второму пункту и делать всё заново.
3. По оптимальной и незапутанной блок-схеме из второго пункта нужно написать псевдокод. Отлаживать его, пока он не станет оптимальным.
4. По оптимальному псевдокоду из третьего пункта написать код на языке программирования. Язык при этом можно подбирать любой.

Вот проходя все эти пункты один за другим (сначала медленно на листочке бумаги, пока учишься, а потом уже быстро в голове), ты и научишься соображать.

Этот алгоритм ещё простой и его можно понять и представить в голове весь. Но есть алгоритмы, которые очень запутаны (типа шифрование в браузере через сертификаты) и ты их просто не представишь в голове из-за задействования множества деталей в одно и то же время (они просто не помещаются в голове одновременно). Вот в таких случаях и приходят на помощь эти стандартные пункты составления алгоритма от идеи до реализации.

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

Ну, на примере этой задачи ты просто задай себе вопрос “а я могу эти клетки закрасить таким образом, как указано, и увидеть, где там стена в конце и не залезть на неё?”. Ты получаешь ответ “да” и дальше ты анализируешь:
сначала “а как я понял, что я не должен закрашивать первую клетку?”
потом “а как я понял, что я могу закрасить вторую клетку?”
потом “а как я понял, что третью клетку тоже надо закрасить?”
потом “а как я понял, что четверётую клетку не надо закрашивать?”
и так далее.
Главное при этом учитывать, что ты не можешь ничего понимать из космоса. Всё понимается по каким-то правилам, вполне определённым. Просто мозг не всегда осознанно думает о чём-то. Многие вещи просто подсознательно выполняются и ты их просто не замечаешь, хотя они есть. Это так же как и при чтении: когда ты читаешь слово с буквой A, ты не думаешь о том, что в этом слове есть буква А. Когда-то давно, в первом классе школы, ты думал об этом, но сейчас этого нет, оно происходит без участия сознания. Но ты всегда можешь проанализировать “а как я понял, что в этом слове буква А есть?”. И так ты увидишь, что сначала ты прочитал её очертания; потом распознал этот набор чёрточек; потом вспомнил, что они вместе означают; потом вспомнил, как эта буква звучит.


tags: algorithm steps



Отредактировано py.user.next (Ноя. 11, 2019 00:27:20)

Офлайн

#5 Ноя. 11, 2019 12:27:56

virgiliys
Зарегистрирован: 2019-11-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

py.user.next
Спасибо за развёрнутый ответ! Хм.. слышал что многие программисты довольно часто работают в обычной тетради. Кажется теперь начинаю понимать почему.

Офлайн

#6 Ноя. 11, 2019 21:04:50

virgiliys
Зарегистрирован: 2019-11-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

Моё решение 30 задачи. Вроде всё работает, но хотелось бы понять что тут не оптимально и в каких местах можно проще/лучше/рациональнее

 len = 1
    while(wall_is_beneath() == 0):
        move_down()
        len += 1
    while(len > 1):
        for i in range(len - 2):
            move_up()
            fill_cell()
        move_up()
        for i in range(len - 2):
            move_right()
            fill_cell()
        move_right()
        for i in range(len - 2):
            move_down()
            fill_cell()
        move_down()
        for i in range(len - 2):
            move_left()
            fill_cell()
        move_up()
        len -= 2
    while (wall_is_beneath() == 0):
        move_down()
    while (wall_is_on_the_left() == 0):
        move_left()

Почитал решение уже после того как выложил, вижу что очень похоже, только без использование подпрограммы

Отредактировано virgiliys (Ноя. 11, 2019 21:21:38)

Офлайн

#7 Ноя. 12, 2019 00:35:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6539
Репутация: +  580  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

virgiliys
Почитал решение уже после того как выложил, вижу что очень похоже, только без использование подпрограммы
К тому заданию подпрограммы уже пройдены в этом курсе, поэтому их можно использовать.

virgiliys
что тут не оптимально и в каких местах можно проще/лучше/рациональнее
Ну, вот как раз неоптимально то, что программа твоя заполняет поле только одним образом и весь код на это завязан. Стоит чуть-чуть поменять условие закрашивания и твоя программа сломается и будет неприменима. И тебе придётся для нового условия писать новую программу целиком. А потом условие ещё раз поменяется и всё опять повторится. Так ты потратишь кучу времени. (В реальном мире ты вообще это сделать не сможешь, потому что там программы огромные и пишутся месяцами. Ты просто не сможешь физически многомесячную программу написать заново.)

Я же сделал подпрограмму рисования “абстрактного круга”. Если условие рисования поменяется (ну например, клетки надо будет закрашивать только через одну или надо будет закрасить только клетки в углах), я могу подредактировать эту подпрограмму и вся программа станет рисовать по другому. Но самое главное, я могу подпрограмму дальше ветвить на другие подпрограммы - то есть делать подпрограммы для подпрограммы. И таким образом программу можно сделать ещё гибче и устойчивее к изменению условий задачи.


Я тебе просто пример из реала расскажу. Я написал программу, которая лазит у браузера под капотом и вытаскивает гиперссылки из его внутренних файлов. Программа сохраняет открытые в браузере ссылки во вкладках в файл на диске. Так их можно просмотреть потом, если вдруг браузер надо срочно закрыть, а в нём осталось много открытых интересных вкладок. Так вот, написал я эту программу для браузера Firefox (это свободный браузер, который никому не принадлежит). И тут в друг однажды вылазит пацан и просит примерно то же самое, но для другого браузера. А я-то писал эту программу только для Firefox'а и Google Chrome не использую вообще. И мне стало интересно, а смогу ли я переделать эту программу, которая первоначально только на Firefox была расчитана? И ты знаешь, я её переделал буквально за час, и через час она уже работала с файлами Google Chrome. Понимаешь, вот такие сюрпризы бывают. Ты пишешь программу для одного, а применять её надо потом вообще в другом. И от того, насколько твоя программа соблюдает правила программирования, зависит то, насколько она будет живучей. Есть хороший пример - Паскаль. Почему сдох этот язык (а при этом его конкурент C, наоборот, выжил и живее всех живых)? Потому что Паскаль нереально было перенести из консоли в современные системы. А почему C выжил? Потому что в нём по максимуму было мало зашито в само ядро языка. Всё, что он делает, он делает через библиотеку функций (функция - это подпрограмма ), которую можно переписать на любой лад.



Отредактировано py.user.next (Ноя. 12, 2019 00:53:46)

Офлайн

#8 Ноя. 13, 2019 00:11:01

virgiliys
Зарегистрирован: 2019-11-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

py.user.next
Понял, лучше писать код для общего случая, если это возможно. Ещё раз спасибо.
Вопрос не по теме и немного глупый. У меня на данный момент очень мало времени есть на учёбу(работа + семья), на работе как понимаешь читать книги я не могу, но хоть целый день могу ходить в наушниках, что и делаю собственно. Вот. Может есть что посоветовать? Желание учиться есть и большое(где оно раньше было лучше не спрашивать) Я кроме как прокачать немного английский ничего дельного не придумал и не нашёл.

Отредактировано virgiliys (Ноя. 13, 2019 00:11:40)

Офлайн

#9 Ноя. 13, 2019 15:37:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6539
Репутация: +  580  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

virgiliys
Понял, лучше писать код для общего случая, если это возможно.
Надо каждую функцию (подпрограмму) в коде писать для общего случая, чтобы её буквально можно было взять из одного кода и перенести в другой без всяких изменений. Для этого есть даже специальная теория про ослабление предусловий и усиление постусловий. Например, если тебе нужно написать подпрограмму, которая считает карандаши, то ты пишешь подпрограмму, которая считает вообще любые объекты (ослабление предусловия) и используешь её, чтобы посчитать карандаши. Кажется “зачем это делать и переутруждать себя?”. Но потом, через год, у тебя возникнет задача посчитать собак, и вместо того, чтобы писать подпрограмму для подсчёта собак, ты сразу возьмёшь эту написанную подпрограмму для подсчёта вообще любых объектов и сразу её используешь, и она посчитает собак, хотя, когда она только писалась, ты и не подозревал, что ею будут считать не карандаши и не сегодня, а собак и через год вообще в другой программе. Так ты пишешь каждую подпрограмму, в результате чего у тебя постоянно появляются полезные подпрограммы, которые можно напрямую брать из разных программ, чтобы собрать из них новую программу. Так ты можешь программу, которую бы писал с нуля целый месяц, собрать из готовых подпрограмм за один день.
Чтобы научиться этому, нужно 1) прочитать теорию про это всё, чтобы знать как можно больше 2) писать это всё практически, делая ошибки и приобретая опыт.
Просто взять и узнать это не прокатит. Надо много тренироваться.

virgiliys
на работе как понимаешь читать книги я не могу, но хоть целый день могу ходить в наушниках, что и делаю собственно.
Чтобы программировать, надо программировать. Послушать книжку и получить просветление не прокатит. Так же как и не прокатит пойти и пройти полуторагодовые курсы в Бауманке или на Скилбоксах каких-нибудь. Так что в таких условиях сможешь лишь научиться “ключи подавать”.

Данный курс - это курс для школьников. Реальные же программы очень далеки от школьных. Но без начального курса в программировании тоже делать нечего. Ты просто не сможешь запрыгнуть на крышу пятиэтажки, если не поднимешься по всем этажам постепенно до самого верха.



Офлайн

#10 Ноя. 13, 2019 20:47:39

virgiliys
Зарегистрирован: 2019-11-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Графический исполнитель "Робот"

py.user.next
Печально. Значит будем учиться “подавать ключи”. На чтение и практику у меня максимум 2-3 часа в день,
сейчас вот читаю “Грокаем алгоритмы”, а из практики задания по роботу закончил.

Отредактировано virgiliys (Ноя. 13, 2019 21:02:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version