stringtranslate.com

Конкурсное программирование

Двое мужчин сидят за столами с компьютером и разложенными на них бумагами.
Петр Митричев (слева) и Геннадий Короткевич (справа), два выдающихся программиста-участника Кубка алгоритмов Яндекса 2013 года .

Соревновательное программирование или спортивное программирование — это интеллектуальный вид спорта, в котором участники пытаются программировать в соответствии с предоставленными спецификациями. Соревнования обычно проводятся через Интернет или локальную сеть . Соревновательное программирование признано и поддерживается несколькими многонациональными программными и интернет -компаниями, такими как Google , [1] [2] и Meta . [3]

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

История

Одним из старейших известных соревнований является Международный студенческий чемпионат по программированию (ICPC), который возник в 1970-х годах [4] и расширился до 88 стран в своем выпуске 2011 года.

С 1990 по 1994 год Оуэн Астрахан , Вивек Кхера и Дэвид Коц провели одно из первых распределенных интернет-соревнований по программированию, вдохновленное ICPC. [5]

Интерес к спортивному программированию значительно вырос с 2000 года и достиг десятков тысяч участников (см. Известные соревнования), и тесно связан с развитием Интернета, который позволяет проводить международные соревнования в режиме онлайн, устраняя географические проблемы.

Обзор

Целью соревновательного программирования является написание исходного кода компьютерных программ, которые способны решать заданные задачи. Подавляющее большинство задач, появляющихся на соревнованиях по программированию, имеют математический или логический характер. Обычно такие задачи относятся к одной из следующих категорий: комбинаторика , теория чисел , теория графов , алгоритмическая теория игр , вычислительная геометрия , анализ строк , дискретная математика и структуры данных . [6] Задачи, связанные с программированием в ограничениях и искусственным интеллектом, также популярны на некоторых соревнованиях.

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

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

Онлайн-судьи — это онлайн-среды, в которых происходит тестирование. Онлайн-судьи имеют списки рангов, показывающие пользователей с наибольшим количеством принятых решений и/или наименьшим временем выполнения для конкретной проблемы. [7]

Известные соревнования

Соревнования по алгоритмам

В большинстве из вышеперечисленных конкурсов соревнования обычно организуются в несколько туров. Обычно они начинаются с онлайн-раундов, которые завершаются финальным туром на месте. Лучшие участники IOI и ICPC получают золотые, серебряные и бронзовые медали. В других конкурсах лучшим участникам вручаются денежные призы. Конкурсы также привлекают интерес рекрутеров из многочисленных компаний, занимающихся разработкой программного обеспечения и Интернета, которые часто обращаются к конкурентам с потенциальными предложениями о работе.

Искусственный интеллект и машинное обучение

Конкурсы, посвященные технологиям с открытым исходным кодом

Онлайн-платформы

Сообщество программистов по всему миру создало и поддерживает несколько интернет-ресурсов, посвященных спортивному программированию. Они предлагают отдельные конкурсы с небольшими призами или без них. Пользователям обычно присваивается рейтинг на основе их результатов в указанных конкурсах. Архивы прошлых задач являются популярными ресурсами для обучения спортивному программированию. Существует несколько организаций, которые регулярно проводят соревнования по программированию. К ним относятся:

Преимущества и критика

Участие в соревнованиях по программированию может повысить энтузиазм студентов к изучению компьютерных наук . Навыки, приобретенные в соревнованиях по программированию, подобных ICPC, также улучшают карьерные перспективы, поскольку они помогают пройти «технические собеседования», которые часто требуют от кандидатов решения сложных программных и алгоритмических задач на месте. [19] [20]

Также имело место критика соревновательного программирования, особенно со стороны профессиональных разработчиков программного обеспечения . [21] Одним из критических моментов является то, что многие быстро развивающиеся соревнования по программированию прививают участникам плохие привычки программирования и стиль кода (например, ненужное использование макросов , отсутствие абстракции ООП и комментариев, использование коротких имен переменных и т. д.). [22] [21] Кроме того, предлагая только небольшие алгоритмические головоломки с относительно короткими решениями, соревнования по программированию, такие как ICPC и IOI, не обязательно обучают хорошим навыкам и практикам разработки программного обеспечения, поскольку реальные программные проекты обычно содержат тысячи строк кода и разрабатываются большими командами в течение длительных периодов времени. [21] Питер Норвиг заявил, что на основе имеющихся данных победа в соревнованиях по программированию отрицательно коррелирует с производительностью программиста на его работе в Google (хотя у победителей соревнований были более высокие шансы получить работу). [23] Позже Норвиг заявил, что эта корреляция наблюдалась на небольшом наборе данных, но что ее нельзя было подтвердить после изучения большего набора данных. [24] [ ненадежный источник? ]

Еще одно мнение заключается в том, что вместо того, чтобы «тратить» свое время на излишнюю конкуренцию, решая проблемы с известными решениями, высококлассные программисты должны вместо этого вкладывать свое время в решение реальных проблем. [21]

Литература

Смотрите также

Ссылки

  1. ^ "Google Code Jam". google.com . Архивировано из оригинала 31 мая 2023 г. Получено 20 февраля 2016 г.
  2. ^ "TCO12 Sponsor: Google - TCO 12". topcoder.com . Архивировано из оригинала 16 февраля 2012 года.
  3. ^ "Facebook Hacker Cup". Facebook . Получено 20 февраля 2016 г. .
  4. ^ Ли, Юцзя; Чой, Дэвид; Чунг, Джуньёнг; Кушман, Нейт; Шриттвизер, Джулиан; Леблон, Реми; Экклс, Том; Килинг, Джеймс; Химено, Феликс; Лаго, Агустин Даль; Юбер, Томас; Чой, Питер; д'Отюм, Сиприен де Массон; Бабушкин, Игорь; Чэнь, Синьюнь (9 декабря 2022 г.). «Генерация кода на уровне соревнований с помощью AlphaCode». Science . 378 (6624): 1092–1097. arXiv : 2203.07814 . doi :10.1126/science.abq1158. ISSN  0036-8075.
  5. ^ Khera, Vivek; Astrachan, Owen; Kotz, David (1993). "The internet programming contest" (PDF) . ACM SIGCSE Bulletin . 25 (1): 48–52. doi :10.1145/169073.169105. ISSN  0097-8418. Архивировано из оригинала (PDF) 8 августа 2017 г. . Получено 10 марта 2020 г. .
  6. ^ Пак, Игорь. «Алгоритмы». Математика 182. Калифорнийский университет, Лос-Анджелес . Получено 31 марта 2024 г.
  7. ^ Проблемы программирования (Скиена и Ревилла) ISBN 0387001638 , ISBN 978-0387001630  
  8. ^ Костка, Бартош (2021). Спортивное программирование на практике (PDF) . Университет Вроцлава.
  9. ^ «Отпразднуйте соревнования Google по программированию финальным раундом веселья в программировании». Блог разработчиков Google . Google . Получено 28 февраля 2023 г. .
  10. ^ "Code Jam - Соревнования по кодированию от Google". Соревнования по кодированию . Архивировано из оригинала 27 июня 2023 г. Получено 26 февраля 2023 г.
  11. ^ "ICPC". icpc.global . Получено 26 февраля 2023 г. .
  12. ^ "Programming Environment – ​​ICPC Documents" . Получено 15 февраля 2024 г. .
  13. ^ "ICPC". icpc.global . Получено 26 февраля 2023 г. .
  14. ^ "Олимпиады". stats.ioinformatics.org . Получено 26 февраля 2023 г. .
  15. ^ "Meta Hacker Cup - 2022 - Квалификационный раунд". www.facebook.com . Получено 26 февраля 2023 г. .
  16. ^ "FAQ - Topcoder Community Town Hall с Дугом Хэнсоном, генеральным директором Topcoder". Topcoder . Получено 28 февраля 2023 г. .
  17. ^ abcdef Луиджи, Уильям Ди; Фарина, Габриэле; Лаура, Луиджи; Нанни, Умберто; Темперини, Марко; Версари, Лука (2016). «oii-web: интерактивное онлайн-программирование oii-web: интерактивная онлайн-система обучения для соревнований по программированию» (PDF) . Олимпиады по информатике . 10 : 207–222. дои : 10.15388/ioi.2016.13. S2CID  6877554.
  18. ^ ab Combéfis, Sébastien; Wautelet, Jérémy (2014). «Обучение программированию и преподавание информатики с помощью онлайн-конкурсов» (PDF) . Олимпиады по информатике . 8 : 21–34.
  19. ^ abcd Блумфилд, Аарон; Сотомайор, Борха. «Руководство по стратегии проведения соревнований по программированию» (PDF) . SIGCSE '16: Труды 47-го технического симпозиума ACM по образованию в области компьютерных наук .
  20. ^ Джексон, Дин (1 декабря 2013 г.). «Техническое собеседование в Google. Как получить работу своей мечты» (PDF) . XRDS: Crossroads, журнал ACM для студентов . 20 (2): 12–14. doi :10.1145/2539270. S2CID  27549057.
  21. ^ abcd Смит, Дункан (2 декабря 2015 г.). «Дебаты о соревновательном программировании».
  22. ^ Халим, Стивен. «CS3233 — Соревновательное программирование». NUS School of Computing .
  23. ^ «Победа в соревнованиях по программированию — отрицательный фактор для хорошей работы». YouTube . 5 апреля 2015 г.
  24. ^ "HN обсуждение взаимосвязи между производительностью труда и конкурентным программированием". Декабрь 2020 г.