Спортивное программирование: что это, зачем и какие задачи приходится решать

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

4753ce0e4adf9c70f047876153f63573.png

Немного истории

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

А вот в 1970 году в Техасском университете (США) было проведено первое студенческое соревнование по программированию ICPC. С тех пор спортивное программирование, что называется, пошло в массы. ICPC поддерживают крупнейшие IT-гиганты, которые выступают спонсорами мероприятия. В разные годы это были IBM, Apple, Microsoft и другие компании. Масштаб соревнования тоже рос. Так, в 2019 году в олимпиаде приняли участие уже 50 тысяч человек из 110 стран.

Что касается России, то первое более-менее значимое мероприятие было проведено в 1981 году: насколько известно, в нём приняли участие всего 4 человека, ученики. Ну, а в 90-х к этому олимпиадному движению примкнули уже и студенты. И чем дальше, тем больше участников стремились попасть на соревнование.

Что такое спортивное программирование и какие задачи решают участники?

Спортивным программированием называют в основном соревнования, где программисты решают алгоритмические задачи при помощи кода. Главная цель участников на большинстве мероприятий — решение задач в условиях ограниченного времени с минимальным количеством ошибок и неправильных попыток. Как правило, участникам нужно решить 4–10 алгоритмических задач в течение пяти часов.

Что касается задач, то они могут быть самыми разными. Но обычно наиболее распространённые направления это:

  • графы. Участники реализуют алгоритмы для работы с графами, включая, например, обходы в глубину и ширину, поиск кратчайшего пути и т. п.

  • структуры данных. Нужно, например, манипулировать расположением элементов массива, расположив их в обратном порядке, или же найти mix/max значение в определённом диапазоне массива с применением дерева отрезков (англ. Segment tree)

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

  • динамическое программирование. В этом случае участникам предлагают решить оптимизационную задачу. Требуется разбивать основное задание на подзадачи и использовать результаты их решения для решения основной

Но это лишь несколько примеров — на самом деле направлений заданий может быть больше.

Что касается сути задач, то кто-то говорил о спортивном программировании следующее. Если представить определённую задачу в виде коридора с горой дверей по обеим сторонам, то обычные разработчики, которые заняты в банковской сфере, промышленности и т. п., будут искать наиболее недорогой и эффективный способ открыть эти двери. Создадут они, скорее всего, лом, ведь «против лома нет приёма». И открыть им можно будет что угодно, но не очень быстро (зато дёшево). А вот участники соревнований, скорее всего, будут разрабатывать универсальные отмычки, что дороже, чем лом, но работает гораздо быстрее.

Самые популярные соревнования

На самом деле различных соревнований достаточно много. Но больше всего участников привлекают три мероприятия.

ICPC (The International Collegiate Programming Contest)

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

Участникам даётся 5 часов и от восьми до пятнадцати задач, для решения которых можно использовать C, C++, Java, Ada, Python или Kotlin. К слову, ICPC очень сильно развивает командные навыки участников, поскольку компьютер, на котором всё это нужно реализовать, — всего один на команду.

Codeforces/TopCoder

Это онлайн-платформы, где участникам нужно решить пять задач за 2–3 часа. Как и на других соревнованиях, задачи нестандартные. Зато участники получают хорошие призы, также есть рейтинг, который мониторят крупные IT-компании.

IOI (International Olympiad in Informatics)

Олимпиадное соревнование, которое проводится в течение двух дней и включает в себя 6 задач — по три на каждый день. Каждое задание можно решать пять часов. Что касается языка, то это С++. Отличие от многих соревнований ещё и в том, что можно использовать литературу или помощь других участников.

Российское спортивное программирование

16 июня 2022 года Минцифры РФ сообщило о признании спортивного программирования новым видом спорта в России. Для его развития была создана Федерация спортивного программирования. Развитие Федерации осуществляется при взаимодействии Минцифры и Минспорта России, которыми в 2022 году было подписано соответствующее соглашение.

»Наш альянс с Федерацией спортивного программирования не только поможет усилить подготовку спортсменов к участию в соревнованиях, но и в целом будет способствовать наращиванию кадрового потенциала в ИТ-сфере. Развитие детско-юношеского спорта — это отличная возможность для студентов и школьников расширить свои знания, усилить компетенции, а также узнавать из первых рук о том, что происходит в мире информационных технологий», — отметил генеральный директор «Лаборатории Касперского» Евгений Касперский.

Кстати, в сентябре открывается регистрация на всероссийскую олимпиаду, которую проводит МТС. Ее важная задача — создание закрытого сообщества разработчиков в стеках Python, Golang, Java, С++, С# и др. Доступ к нему смогут получить игроки, правильно решившие отборочные задачи на логику и эрудицию. Победители финального очного состязания разработчиков получат денежное вознаграждение от МТС: 3 млн рублей за первое место, 1,5 млн рублей за второе место и 500 тыс. рублей за третье место.

Помимо официальных соревнований участники получат возможность побывать на фестивале технологий с конкурсами, квестами и косплей-перевоплощениями. На главной сцене выступят приглашенные селебрити и ИТ-звезды. На площадке олимпиады будут работать развлекательные и карьерные стенды — лучшие специалисты смогут получить оффер от МТС. 

Участвовать смогут не только школьники, студенты, но и действующие ИТ-специалисты — для них в рамках мероприятия предусмотрен отдельный поток. Отборочные состязания будут проходить в несколько этапов: регистрация и доступ в закрытый Telegram-канал, серия онлайн-заданий от ведущих специалистов МТС и финальный очный тур с программированием на скорость. Более подробно об олимпиаде расскажем чуть позже.

Что даёт участие в спортивных соревнованиях?

Главное — совершенствование навыков. Кроме того, это возможность профессионального роста, а также получения приза, порой весьма немаленького. Также можно получить и вакансию в крупной компании с отличной зарплатой.

Кроме всего, если постоянно участвовать в соревнованиях, то мышление человека начинает работать гораздо более чётко, структурно, если так можно выразиться. Развиваются и другие скилы:

  • стрессоустойчивость. Любое соревнование, даже дружеское, — это стресс. Выиграть же хочется, а желающих может быть много. Ну, а олимпиады по спортивному программированию — это и вовсе чистый стресс, поскольку работать приходится в условиях ограниченного времени и при наличии сложных задач. Этот навык — один из самых важных, при условии, конечно, наличия необходимых знаний и опыта

  • тайм-менеджмент. Выше уже говорилось про ограниченное время. И здесь этот скил нужен как нигде больше. Чем эффективнее участник умеет управлять временем, тем больше шансов, что он решит больше задач

  • командная работа. Во многих случаях участники объединяются в команды, хотя есть и индивидуальные соревнования. Благодаря этому разработчики учатся общаться друг с другом, находить общее решение, искать компромисс

  • алгоритмическое мышление. Это очень важно не только для спортивного программирования, но и для профессии разработчика

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

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

© Habrahabr.ru