2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 15:54 


30/03/20
363
Добрый день. В январе я записывался на курс по Питону и за четыре месяца я его не осилил (преодолел три раздела из пяти). Хочу попытаться в следующем году, до начала курса семь месяцев, за эти семь месяцев я хочу научиться достаточно быстро решать учебные задачи. Так как тесты предполагают именно это, три полуторачасовых теста по четыре задачи, два двухчасовых по четыре задачи и итоговый четырёхчасовой в 12 задач (приступал к двум первым тестам, оба раза я не успел)

Текущий уровень, три часа решал вот такую задачу (на C):
Цитата:
Шифр Цезаря.
Написать функцию void char_cesar(char * ch, int shift), которая изменяет переданный ей символ ch по алгоритму Цезаря с ключом shift. Шифр Цезаря заключается в замене текущего символа на тот, который находится в алфавите на k позиций правее. Например, буква a при сдвиге 2 будет заменена на букву c, буква x при сдвиге 4 будет заменена на букву b, т.к. мы считаем алфавит зацикленным.

Решил вот так:
Используется синтаксис C
void char_cesar(char * ch, int shift){
    // ТОЛЬКО ДЛЯ SHIFT >= 0
    *ch = (*ch + shift) % ('z' + 1) % 'a' + 'a';
}

Самая сложная задача курса Python которую я видел (она не задана как задача, а разбирается в учебных материалах как бонусная) вот такая:
Цитата:
Предположим, что нам нужно сделать программу, которая разгадывает судоку. Пусть поле моделируется списком списков с целыми числами:
Сформулируем рекурсивный алгоритм решения судоку.
Если на поле судоку нет пустых клеток, оно уже решено и надо просто вернуть поле в качестве решения
Если есть пустые клетки, надо вычислить какую-либо пустую клетку, для которой количество возможных вариантов минимально. Попробовать по очереди проверять эти варианты, и, если будет найдено решение, вернуть его
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
from random import shuffle
from copy import deepcopy
from pprint import pprint


def make_assumptions(sudoku):
    for i, row in enumerate(sudoku):
        for j, value in enumerate(row):
            if not value:
                values = set(row) \
                         | set([sudoku[k][j] for k in range(9)]) \
                         | set([sudoku[m][n] for m in range((i // 3) * 3, (i // 3) * 3 + 3)
                                for n in range((j // 3) * 3, (j // 3) * 3 + 3)])
                yield i, j, list(set(range(1, 10)) - values)


def solve(sudoku):
    if all([k for row in sudoku for k in row]):
        return sudoku
    assumptions = list(make_assumptions(sudoku))
    shuffle(assumptions)

    x, y, values = min(assumptions, key=lambda x: len(x[2]))

    for v in values:
        new_sudoku = deepcopy(sudoku)
        new_sudoku[x][y] = v
        s = solve(new_sudoku)
        if s:
            return s
    return None


pprint(solve(field))


Вот было бы неплохо научиться подобного уровня сложности задачи решать скажем за полчаса. Стоит отметить что это бонусная задача всего лишь из середины курса
Пока я колеблюсь между чтением книги Лутца "Изучаем Питон" 2011 года и последовательным прохождением курсов Python отсортированных по убыванию популярности на сайте stepik.org
Аргумент в пользу чтения книги: предположительно подробное изложение теоретического материала, аргументы против: книга морально устаревшая, книга слишком толстая (уж для меня то это точно имеет значение), в книге мало задач
Аргументы в пользу курсов: большое количество задач и автоматизированная система тестирования, аргумент против: предположительно скудное изложение теории предполагающее активное использование сторонних материалов

Вообще, программа курса вот такая: https://yandexlyceum.ru/newteachers#course

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 15:59 
Заслуженный участник


09/05/12
25179
Очевидный первый же вопрос, без ответа на который обсуждение не имеет смысла - что на самом деле вам надо:
1) научиться программировать;
2) изучить Python;
3) и то, и другое (причем обязательно в комплекте)?

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 16:06 


30/03/20
363
Pphantom
Пожалуй пункт три, так как лелею намерения стать преподавателем Python на площадке Яндекс Лицея

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 16:15 
Заслуженный участник


09/05/12
25179
Cuprum2020 в сообщении #1521440 писал(а):
Пожалуй пункт три, так как лелею намерения стать преподавателем Python на площадке Яндекс Лицея
:facepalm:

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 16:17 


30/03/20
363
Pphantom
Я чего то не того желаю?

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 17:19 
Заслуженный участник


20/08/14
11073
Россия, Москва

(Оффтоп)

Упаси боже детей/студентов от таких преподавателей ... Полчаса решать задачу на пять минут, включая написание кода и тестирование ... Причём явно далеко не оптимальным способом ... Нет, я конечно понимаю что "уча других разбираешься сам", но всё же хоть какая-то база нужна же ... В том числе и знание стандартных алгоритмов. Без привязки к языку.

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

И при этом я не считаю себя достаточно квалифицированным для преподавания программирования кому-то старше детсада.

(Pphantom)

Мы старые брюзги и нас ждёт судьба динозавров, да? ;-) Скоро уже дети будут учить друг дружку, непонятно правда чему ... :facepalm:

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 17:38 
Заслуженный участник


09/05/12
25179
Cuprum2020 в сообщении #1521442 писал(а):
Я чего то не того желаю?
Cuprum2020 в сообщении #1516432 писал(а):
Программирование - не моё, пятиминутное видео запросто на три часа отбивает всякое желание продолжать.
За прошедший месяц, надо думать, мало что изменилось...

Ситуацию "программирование - это не мое, но освоить нужно" я понять вполне могу. Но вот такое - уже нет.

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 18:38 


30/03/20
363
Pphantom в сообщении #1521453 писал(а):
За прошедший месяц, надо думать, мало что изменилось...

В общем то да, иной раз даже пять минут плотно упакованной информации для меня немало
Pphantom в сообщении #1521453 писал(а):
Ситуацию "программирование - это не мое, но освоить нужно" я понять вполне могу. Но вот такое - уже нет

Что именно? Разве преподавание ученикам 8-9 классов, пусть и весьма не средним, сложнее освоить чем настоящее программирование? К тому же тут чёткий критерий отбора, надо дойти до финального теста и написать его на 60 баллов из 100 возможных. Хотя дальше мотивационное письмо и онлайн собеседование, но я убеждаю себя что это формальности
Dmitriy40 в сообщении #1521446 писал(а):
Полчаса решать задачу на пять минут, включая написание кода и тестирование

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

Вообще, ориентируясь на курс языка Си для школьников, мой результат лучше чем у 97,5% начинавших курс и будет ещё лучше так как я намерен решить все 271 задачу из 271, вполне могу оказаться в топ 1%. Поэтому имею наглость считать себя не совсем уж прям безнадёжным

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 19:11 
Заслуженный участник


09/05/12
25179
Cuprum2020 в сообщении #1521466 писал(а):
Что именно? Разве преподавание ученикам 8-9 классов, пусть и весьма не средним, сложнее освоить чем настоящее программирование?
Вообще-то преподавание кому-либо чего-либо предполагает необходимость самому это хорошо знать и уметь. Это не достаточное условие, но необходимое.

Ладно, впрочем, это вопросы скорее к Яндексу.

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 20:11 
Заслуженный участник


20/08/14
11073
Россия, Москва
Cuprum2020
"Уметь решать задачи" не равно "уметь учить других", даже лишь тоже решать те же задачи. Надо разбираться в вопросе минимум в несколько раз (а лучше на порядок) лучше учеников. При более-менее одинаковом уровне знаний "помогать решать" можно, "учить решать" нет. А уж просто "учить" тем более нет. Ну пусть будет ИМХО.

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 20:57 


30/03/20
363
Dmitriy40 в сообщении #1521477 писал(а):
При более-менее одинаковом уровне знаний "помогать решать" можно, "учить решать" нет

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

(Оффтоп)

Короче никуда мне с завода лучше не дёргаться и молиться, чтобы хватило здоровья на ближайшие лет тридцать, чтобы завод за это время не закрыли, персонал не сократили и меня самого не попросили. А я очень, очень легко заменяем и моя работа роста квалификации не предполагает

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 21:54 
Заслуженный участник


20/08/14
11073
Россия, Москва
Cuprum2020
Да дело не только в автопилоте или скорости генерирования программы, а в знании стандартных подходов, их плюсов и минусов, что вариантов решения больше одного и каждый имеет преимущества и недостатки. Редко когда этим заморачиваются при обучении решения задач.
Вот как пример: в первой задаче выше половину взятий модулей можно сделать однократно заранее, а вторую половину исключить продублировав алфавит, и это два разных метода оптимизации. И останется лишь обращение в массив/таблицу и всё. На тексте в мегабайт разница незаметна, на гигабайтном тексте очень даже.

Плюс, лично для меня, важным признаком преподавателя является умение ответить на "каверзные" вопросы учеников по теме урока, которые могут выходить далеко за рамки урока. Именно для этого нужно знать предмет существенно лучше учеников и учебника. Просто пересказывать учебник - за преподавание не считаю.

Ну и апелляция что вчерашнему школьнику лучше видны затруднения других школьников — довольно спорное утверждение. Ведь он видел лишь свои затруднения, а учитель — затруднения многих и многих, если ещё не на личном примере, то уж его именно этому и учили, типичным ошибкам учеников. И тут широкая выборка заборет личные качества. Исключения редки.
Но вообще то это уже вопрос в "Вопросы преподавания", где я высказываться поостерегусь.

PS. Возможно я слишком идеализирую.

-- 06.06.2021, 22:08 --

Ой, это я пропустил.
Cuprum2020 в сообщении #1521466 писал(а):
Разве преподавание ученикам 8-9 классов, пусть и весьма не средним, сложнее освоить чем настоящее программирование?
Да, сложнее. Учить других вообще сложнее чем что-то делать самому.
Например самому обычно достаточно решить задачу хоть как-то, пусть даже в жестко заданных рамках (типа олимпиад), но просто решить и всё. А ученикам может понадобиться объяснять почему именно так, почему не по другому, чем другой путь (которых далеко не один) хуже или лучше, уметь быстро и обоснованно оценивать предложенными ими пути решения. Всё это на порядок, а то и два, сложнее чем просто решить задачу. А иногда, математики не дадут соврать, вообще упирается в открытые проблемы. И попытавшись погрузиться в разбор такого вопроса можно попасть в неловкую ситуацию ... ;-) Понимаете, ученики могут и не знать (да и не должны) что тут засада, но не знать этого учителю ... Стыдно. Хотя в истории встречались и прорывы именно из-за такого незнания, но это всё же очень редкие исключения.

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение06.06.2021, 23:25 


05/09/16
11469
Cuprum2020 в сообщении #1521438 писал(а):
Решил вот так:

А заглавные буквы оно тоже шифрует правильно?

 Профиль  
                  
 
 Re: Как научиться бодро решать задачи используя Python?
Сообщение07.06.2021, 05:45 


30/03/20
363
wrest
Нет, такой задачи перед программой не стоит

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group