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

image
Год из года можно видеть в заголовках новостей яркие фразы вроде «Российские программисты снова одержали победу»; да и наш президент не обходит этот вопрос стороной. Слова-то, конечно, приятные, но вот что всё это значит?

Как проходит первенство

Соревнований по программированию в мире много, но среди всех особо выделяется ACM ICPCAssociation for Computing Machinery International Collegiate Programming Contest — Международное Межвузовское Первенство по Программированию, которое проводит небезызвестная ACM. Структура контеста проста — Не более двенадцати команд от вуза на четверть-финала, не более четырёх — на полу-финал, и лишь одна — на финал. В течение одного тура соревнования, который, за исключением технических деталей, длится пять часов, каждая команда должна написать наибольшее количество программ, решающих задачи из числа предложенных; а их, как правило, от восьми до шестнадцати. С технической точки зрения программы простейшие: ни тебе GUI, ни работы с базами данных, ни других подобных свистелок: простое консольное приложение — прочитай что-то, обработай и выведи результат вычислений.
Однако всё кажется таким простым лишь на первый взгляд: мало того, что для решения задачи требуются серьёзные математические познания и смекалка, так ещё и критерии оценки крайне строги:
  • Корректность: программа должна всегда выводить верный ответ;
  • Надёжность: программа не должна «падать»;
  • Эффективность по времени: общее время работы программы на всех тестах не должно превышать установленного предела; чаще всего — от доли секунды до нескольких секунд;
  • Эффективность по памяти: объём памяти, который программа использует для своей работы, сильно ограничен;
А теперь добавим, что входные данные могут содержать миллионы и даже миллиарды значений, а также что если хотя бы на одном из многих (порой их число заходит за тысячу) тестов программа не будет удовлетворять хотя бы одному пункту из перечисленных выше, попытка сдать задачу не будет засчитана, а команде будет добавлено штрафное время. Стоит ли говорить, что тестовые данные участникам не известны?

Пример олимпиадной задачи

Рассмотрим простой пример: пусть нужно написать программу, которая примет на вход массив чисел, а затем будет выполнять запросы вроде getmax чтобы получить наибольшее число, или modify a b, чтобы заменить a на b? А что, если размер массива — миллион, а нужно выполнить сто тысяч запросов? А что если числа можно удалять? А что если нужно выводить k-е по размеру число? А что если числа заменить на строки? И при этом — на всё есть лишь секунда и какая-то жалкая пара мегабайт памяти. Всё уже не кажется настолько тривиальным, не правда ли? И этот пример — простейший, у олимпиадника такая задача отнимет всего несколько минут.

А я тут причём?

Логично считать, что навыки олимпиадного программирования пригодятся любому специалисту, ведь тогда он начнёт серьёзно следить за эффективностью своих творений. Если это интересует читателей, я буду вполне рад продолжать публикации в этом направлении, а именно: для начала «как стать олимпиадником», «от каких привычек следует отказаться», затем могу пополнять блог «алгоритмы» и рассматривать отдельные особо интересные и примечательные олимпиадные задачи.

P.S. Я тут новичок, поэтому не пойму: а где лучше размещать подобные посты? Разрываюсь между Алгоритмами, Ненормальным Программированием и Учебным Процессом. Как вы думаете? — спасибо khayrov
P.P.S. Разумеется, перенести в соответствующий блог я пока не могу в силу отсутствия кармы. Кстати, в помощи ничего не нашёл про ограничения для новичков на публикацию в коллективных блогах. Я плохо искал, или их действительно нет? — спасибо Mithgol
P.P.P.S Copyright фотографии: David Hill, взята из фотоархива ACM ICPC.

UPD: перенёс в блог спортивное программирование. Спасибо за карму и разъяснения.
UPD2: Пост #2 с нами.
+69
26 сентября 2009, 21:35
13
gvsmirnov 32,2

комментарии (92)

+1
khayrov #
Блог специальный на Хабре есть для таких постов: Спортивное программирование.
+1
gvsmirnov #
Спасибо. Я, видимо, мало искал :)
+1
Mithgol #
По адресу habrahabr.ru/info/help/blogs/ (в ответе на вопрос «Кто может опубликовать хабратопик?») сказано:

— Публиковать хабратопики в коллективных блогах могут зарегистрированные пользователи с кармой ≥5.
+5
gvsmirnov #
И тебе спасибо.
+2
karlicos #
Спасибо, буду очень рад публикациям алгоритмов и интересных задач =)
+2
kochetkovweb #
Было бы интересно взглянуть на реальные олимпиадные задачи. Пожалуйста, продолжайте начатое.
0
gvsmirnov #
Непременно.
0
MiXei4 #
По двенадцать команд от вуза на четверть-финала

По-моему это не совсем правда :) По крайней мере в нашем регионе 12 команд могли позволить себе лишь организаторы — Саратовцы. От нашего ВУЗа максимум было 3. От некоторых по одной команде. Организаторы не смогли бы разместить всех, если б приехали по 12 команда от ВУЗа.
по две — на полу-финал

Здесь опять организаторы (Питер) выставляли больше двух команд. А в 2007 году Саратовцы привезли как-то 4 команды. Дальше не знаю — это был последний год моего участия.
и лишь одна — на финал.

Ну с этим вроде не поспоришь. Если у нас ещё можно как-то привезти лишние команды, то на мир уже всё по правилам. :) Хотя обидно наверное заняв 4 место в полуфинале не ехать на финал, потому что 1 место заняли твои сокурсники :)
0
gvsmirnov #
> По-моему это не совсем правда
Не более двенадцати — сейчас исправлю

>организаторы (Питер) выставляли больше двух команд
Да, я ошибся. Не более четырёх команд.
0
halyavin #
И даже это не совсем правда. Как-то раз нашу команду (MSU SE) взяли пятой, только вместо Питера — в Ереван.

А еще нельзя участвовать больше 5 раз в полуфинале. Только это тоже не совсем правда, поскольку мне позволили 6. В общем — я живое исключение из правил ACM ;).
0
Dr_Gnoiseberg #
Саратовцы! Ждите в гости на четвертьфинал :)
НЛО прилетело и опубликовало эту надпись здесь
0
xgraph #
Я когда-то участие в подобных мероприятиях принимал. Там много простых задач, отягощённых требованиями, поначалу кажущимися невменяемыми. Эти требования начисто убивают возможность решить задачу в лоб.

Стандартный пример из описанных: есть массив чисел, надо вывести k-е по размеру и уложиться в секунду. Возможности компьютера заданы. Отсортировать и посчитать не успеете, придётся выдумывать хитрости.

Усложнённый пример — эти числа целые, но выходят далеко за любые целочисленные форматы. Придётся считать числа как строки.
0
kolyan #
Была как-то раз задачка, которая никаким перебором не вкладывалось в ограничения по времени. Точно не помню, но задачка вроде: для входного целого числа посчитать афигеть какое большое, мудреное и сложное другое число. На нашем этапе, все команды кто вообще решал эту задачу, просчитали ее «в фоне» для входных чисел от 1 до 8, а в вариант «на проверку» тоупо захардкодили ифами. Верхний порог входных данныз подбирался методом «прокатит-не прокатит».
0
gvsmirnov #
Предподсчёт — частая практика на контестах. Обычно с ним борются большими ограничениями. Хотя это не всегда помогает.
0
karlicos #
заглушка называется =)
0
kolyan #
Ну пардон, опыта ёк :) Просто че-то вспомнилось. Участие в олимпиадах было незабываемым опытом, который ни на какой работе не получишь. И хоть задачи далеки от прикладного использования, смекалку развивают на раз.
0
Regis #
Обычно «заглушки» имеют смысл на контестах, где даже неполное прохождение задачи идет в плюс. А на ACM-контестах обычно требуется 100% тестов, так что там заглушки мало применимы.
0
xgraph #
Это ошибка организаторов, по-моему. Надо лучше условия составлять.

У нас как-то организаторы лоханулись, поставив временное ограничение, посчитанное на слабом компе, на соревнования. А там стоял мощный сервер, позволявший уложиться в это время при банальном переборе.
0
gvsmirnov #
У нас недавно было веселье с точностью до наоборот: Время определяли на крутом серваке, а запускали на слабом. Матерились и переписывали на чистый C, чуть ли не с ассемблерными вставками.
0
xgraph #
Ну, нерешаемые задачи — тоже обычное дело :)
0
karlicos #
У многих так с Topcoder'ом получается)) Все привыкают что на задачи в среднем порядка 10^8 операций отводится на обычных олимпиадах) А сервер топкодера на несколько порядков больше может, поэтому многие задачи просто перебором там проходят)
0
gvsmirnov #
Это только на просто решении задачек так. На контестах они специально TL уменьшают.
0
halyavin #
Используйте константные массивы! Объявление массива-константы легко генерировать из программы, в отличие от цепочки if'ов. Да и меньше строк оно обычно занимает.
0
Kakysha #
Поясню для тех, кто не имел опыта в решении таких задач:
«считать числа как строки» означает считывать числа как строки (string) и потом переводя каждый символ строки в число (функциями или по кодам символов, благо они упорядочены) производить операции над ними «столбиком».
0
gvsmirnov #
Перевод задачи на русский язык:

1) Программе на вход задаётся массив строк с n элементами (1 ≤ n &le 1 000 000).
2) Программе последовательно подаётся m (1 ≤ n &le 100 000) запросов вида:
getmax k — получить k -й максимум
remove a — удалить из массива элемент со значением a
modify a b — заменить в массиве элемент со значением a на b

А что тут подтверждать-то?
0
gvsmirnov #
Поправка:
Программе последовательно подаётся m (1 ≤ n ≤ 100 000) запросов вида:
1 ≤ m ≤ 100 000
НЛО прилетело и опубликовало эту надпись здесь
0
gvsmirnov #
Ошибаетесь. Я бы не привёл такого примера, если бы это не могло находиться в одной задаче.
Все операции реализуются одной структурой данных — сбалансированным деревом поиска.
Что именно Вас смутило?
НЛО прилетело и опубликовало эту надпись здесь
0
xgraph #
В обычных задачах ограничений немного. То есть парочка из шести, например. Но вполне могут быть и все шесть, если задача сложная.
+1
gvsmirnov #
Стиль статьи — публицистический. Задачи на реальных олимпиадах никогда не излагаются так, как это сделал я в комментарии. Там всегда (почти) есть история, по двум причинам: ослабить внимание читателя(чтобы он пропустил важную деталь) и повеселить составителя.
НЛО прилетело и опубликовало эту надпись здесь
0
gvsmirnov #
Специально для вас — отыскал контрольную работу, которую нам давали на первом курсе. Лишь немногим проще, что вполне объясняется тем, что это вовсе не всемирная олимпиада.

Вас интересует задача А.
0
MiXei4 #
Не хилые в ИТМО контрольные :)
–1
gvsmirnov #
Это только на одной кафедре такие.
И это довольно простая была)
0
karlicos #
Да уж, особенно учитывая, что на неделю)
0
gvsmirnov #
Решение проверяется точно так же, как оно проверяется на олимпиадах — т.е. девятью тысячами одним тестом.
+3
xgraph #
Over 9000
0
halyavin #
Здесь не нужно сбалансированное дерево поиска. Проходимся по запросам первый раз, строим множество чисел, которые в них используются и сжимаем координаты. Далее — дерево отрезков (операция — сумма) над массивом флагов — есть число или нет. Все 3 операции выполняются за O(log n).

Вот только 2 мегабайт не хватит ни на сбалансированное дерево, ни на этот алгоритм, если размер входного массива на много больше. В таких задачах ограничение меньше чем 32 мегабайта не бывает. 2 мегабайта даются только на алгоритмы за O(n) которые нужно решать в несколько проходов (встречаются довольно редко).
0
gvsmirnov #
Автор явно фанат деревьев отрезков.
0
halyavin #
По сравнению с сбалансированным деревьями — не сомненно.
0
rayevg #
А в чем проблема?
–2
flastar #
Скока тренинга конечн нужно и какой мозг!!! Конечно, чуваки молодцы, но всю жизнь тратить на это просто тупо(((
0
xgraph #
С чего вы взяли, что всю жизнь?
–7
flastar #
Я сам выйграл область по Паскалю в прошлом году. Это реально не нужно! Эт конечно вах, да, круто, я так не могу, они мега-прогеры. Все мега прогеры, что эти чуваки пол-часа подумают, что ты 1 час. Что дает потраченное время? сосбно ничо. Лучше, отдохнуть сходить. Я как вспомню, каждый вечер, сидеть решать, сидеть решать. Ужос(((
+4
xgraph #
Это хорошие упражнения для мозгов и удобная «пузомерка», не более того. На деле это почти не нужно, тут я согласен. Но как элемент системы обучения олимпиады вполне имеют право на существование.
0
flastar #
Ну на то они и есть!)))
–1
gvsmirnov #
На деле они очень резко улучшают производительность программ, которые человек пишет.
+3
xgraph #
Тем не менее, в обычной работе программиста способность писать хорошо документированный и сопровождаемый код намного более ценна, чем умение создать идеальный алгоритм.

То есть, одно другому не помеха, и это плюс программеру, но сказать, что такие умения резко повышают его ценность на рынке труда, я не могу.
0
gvsmirnov #
Смотря в какой области программировать. Есть задачи, в которых производительность критична. У нас за неоптимальный код лишают премии, а то и зарплаты.
0
xgraph #
Согласен. Но иногда проще поставить ещё один сервер, чем оптимизировать код. И дешевле, главное.
0
gvsmirnov #
Если алгоритм работает за O(n3) вместо O(n ⋅ logn), то не спасёт даже десять серверов.
+3
xgraph #
Я ж говорю — иногда :)

А писать грамотный код должен любой приличный прогер, а не только чемпион олимпиад.
–1
nerezus #
И убивают читаемость и поддерживаемость.
По себе знаю — посмотрел недавно код того, что осталось с былых времен. Убил бы за такое.
+2
gvsmirnov #
Похоже, мы говорим о разных вещах.
Реализация алгоритма всегда читаема и понятна, когда человек читающий алгоритм знает, а человек написавший был адекватным.
+2
gvsmirnov #
Почему это всю жизнь? Олимпиадная карьера кончается лет в двадцать-двадцать пять.
–2
flastar #
ну не всю) я так преувеличил чуть)
+2
MiXei4 #
Так же «тупо» тратят жизнь все спортсмены: атлеты, борцы, пловцы, лыжники, шахматисты.
Я уж не говорю про компьютерные игры, многие из которых максимум что развивают — пальцы рук :)
НЛО прилетело и опубликовало эту надпись здесь
–5
vasilievvv #
Производительность, кстати, при реальной разработке (по крайней мере, в веб-программировании) в основном обеспечивается за счёт хорошего знания устройства БД и кэширования всего, что можно, а не алгоритмами.
–1
gvsmirnov #
Вы в курсе, что практически во всех распространённых языках программирования (кроме Ruby, вроде бы) то же самое сопоставление подстроки работает за O(m⋅n)?
–1
vitalikk #
Особенно если не знать алгоритмов, а программированию учиться по серии «Для чайников...» =)
–2
vasilievvv #
Ну, о том, что «LIKE 'sting%'» работает быстрее «LIKE '%string%'», вам вряд ли расскажут в таких книгах.
0
vitalikk #
Ну это как бы и так понятно, если понимать, как этот LIKE работает ;)
0
vitalikk #
Здорово было бы, если бы вы рассказывали понемногу о движении. Пару лет назад в олимпиадах участвовал, но потом приелось — захотелось больше практики и шуршащего вознаграждения за свой труд. Тем не менее, тема полна романтики и до сих пор немного будоражит =)
НЛО прилетело и опубликовало эту надпись здесь
0
gvsmirnov #
Ждите:)
–13
AndryBlack #
хуита. (С)
–12
AndryBlack #
«практикующим» программистам это
а) ничго не дает
б) вредно
+5
gvsmirnov #
Цивилизованные люди в дискуссии приводят аргументы.
0
CyMpak #
Хотя предыдущему оратору влепил заслуженные минусы, кое что здравое в его словах все таки есть.

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

То, что ничего не дает — полный бред. ИМХО, это:
а). Интересно.
б). Если не прокачивает мозг, то хотя бы не дает ему засохнуть.
в). Тренирует умение работать в команде и коммуницировать (вот этих навыков часто it'шникам очень не хватает).

Очень хочу поучаствовать, хотя сам уже пенсионер 5 курсник. Жду от вас следующих публикаций по теме.
+1
za4to #
В реальной жизни надо решать бизнес задачи наиболее эффективно и оптимизировать в первую очередь алгоритм их решения, а не код.

Я не понял, это аргумент за спортивное программирование или против? На олимпиадах как раз наиболее важным является правильный выбор алгоритма, а не оптимизация кода. Обычно ограничения по времени подбираются так, чтобы отсекать менее оптимальные алгоритмы, при этом алгоритм с нужной алгоритмической сложностью проходит, даже если реализован не лучшим образом.
+1
CyMpak #
Это коммент за объективность. :) В первой части минусы, а во второй уже плюсы.

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

Думаю, оптимизация кода == выбор правильного алгоритма программы.
+3
vikds #
Поддерживаю автора в его начинаниях!
Сам несколько лет «играл» в ACM ICPC. Если будет возможность осветить, лично меня, теперь больше всего интересует правильная стратегия подготовки команды к олимпиаде, аспекты командной игры, как распределили роли к выступлениям и обменивали знаниями при подготовке. Если это не NDA, с удовольствием про это бы почитал. =)
0
gvsmirnov #
Я, вообще, не хотел особо много писать про ACM ICPC. Но теперь подумаю)
0
vikds #
Не обязательно именно про ACM ICPC. Мне просто любопытно, каким образом выглядело участие в ACM в других командах изнутри. Имхо — это чуть ли не самый важный опыт таких олимпиад. =) Мне лично до сих пор пригождается.
Если вдруг мысли сами сформируются в интересный рассказик касательно этой стороны олимпиадного программирования — с удовольствием бы почитал. Просто мое пожелание. =)

Спасибо Вам за отзывчивость! =)
0
gvsmirnov #
Хорошо. Но это, вообще, вполне бы потянуло на блог «Юмор», потому что диалоги типа
— Что?? Какое перемножение матриц!? Ты что!? Там совершенно другая формула получается!
— Нет, тут именно модифицированное перемножение матриц! Если хочешь другую формулу — пиши сам, я её не понимаю!
— Да что ты куришь вообще, причём тут матрицы?! Сам пиши свой бред!


Не слишком подходят в спортивное программирование)
0
vikds #
Согласен. =)

Только я имел ввиду несколько иное. Мы когда в числе 3-х человек на первых курсах захотели «подтянуться» в олимпиадном программировании, собирались после пар и определили порядка 10 различных типовых задач: всевозможные извращенные сортировки, переборы, динамика, графы, вычислительная геометрия, деревья, (длинная) арифметика,… Их разделили между собой примерно поровну. Чтобы все в команде зналось наизусть.

При выступлении стратегия была проста: 1 кодит, 1 на листочке фигачит в коде следующее решение, оставшийся контролирует / учавствует в конструктивной критике «рождаемого» алгоритма. Потом циклически роли меняются. Т.е. получалось что почти в любой момент: у кодера есть «наблюдающий», чтобы меньше было опечаток в реализации, и у «генератора решения» есть критик. Приблизительно по такой схеме нам удавалось успешно выступать. Есть еще некоторые тонкости — но это «много букаф».

Интересно, как Вам удавалось работать в команде.
Если вдруг пока свежи воспоминания, у Вас получится интересный рассказ о командной работе. =)
0
gvsmirnov #
Вообще, мы друг другу хорошо доверяли, и поэтому у кодера был супервайзер только тогда, когда он не получал AC с первого раза. Пока один кодит, остальные вместе или по отдельности обдумывали другие задачки.

Кстати, моя олимпиадная карьера в самом разгаре, я ещё не пенсионер)

В общем, я подумаю о Вашей просьбе)
+1
erni #
А про ТопКодер напишете?
0
gvsmirnov #
Я им не слишком увлекаюсь, да и писать-то особо нечего. Так, в общих словах.
+1
erni #
жалко. и не согласна, что особо нечего. хотя последние полтора года мало слежу за тем, что происходит в облсти спортивноо программирования в целом.

вообще было бы круто если бы кто-то сподобился написать серию материалов про историю СП. мы на ТТБшке, что все хотели это замутить, но так и не дошли руки.
0
gvsmirnov #
Я никогда не увлекался историей) Я, вообще, планировал писать в ключе «как добиться успеха».
0
erni #
в любом случае хорошо, что вы сюда пишете. вы из ИТМО или СПбГУ?
+1
gvsmirnov #
ИТМО)
+1
erni #
привет тогда станкевичу и всей прочей СП-братве от Лены Носовой. и передайте им, что я еще вернусь!!! :)
0
gvsmirnov #
Если не забуду, обязательно передам :)
0
Crypto #
Плавали — знаем ;)
0
CapitanBlood #
отрадно видеть братьев по АСМ)
сам являюсь капитаном команды вот уже 6 год)
0
cronoc #
Чтобы «подтянуться» на первых курсах в олимпиадном программировании, желательно ходить в «качалку»-соответствующий кружок класса так с 5-7)… И окончить 11 класс минимум с выходом через город на область..)

Касательно реальной жизни — быстрота красота и общая правильность кода, разве не к этому надо стремиться? Если «программист с дипломом» 2 часа может втыкать на комбинацию простейших сортировок 2 вложенными циклами, тренированный олимпиадник пишет свой код или понимает чужой на автомате)
0
Sammarize #
СПбГУ, по-моему, ежегодно команд семнадцать посылает на четвертьфинал) Но, надо честно признать, смысл участвовать есть командам десяти, максимум (сужу по последнему четвертьфиналу).

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