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

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску
Типичный участник

Спортивное программирование (олимпиадное программирование, олимпиады по программированию, англ. competitive programming) — решение весёлых и неповторимых абстрактных задач задротами-школьниками и к ним приравненными.

Задачи[править]

В зависимости от формата и степени доставления участникам бывают:

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

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

По разным форматам правил проводятся региональные и мировые онсайт-соревнования, интернет-соревнования и онсайт-финалы, ну или просто соревнование проводится один раз в год.

Также существуют сайты, позволяющие задрачивать в любое время суток.

Наиболее успешны обычно те, кто начинает упарываться со школьного возраста.

Особо преуспел как в подготовке спортсменов-программистов, так и в распиаривании этой деятельности, Университет ИТМО.

В этой стране ICFPC широко популяризировался после этого поста. В 2010 году в топ 100 ICFPC русских комманд было сильно много.

Форматы правил[править]

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

ACM плюс — то же самое, что и ACM, но за успешно задачу начисляется не одно очко, а 1 минус 0.2*количество неудачных попыток по ней, поэтому задача, сданная с 6-й попытки или после, ухудшает результат участника.

IOI — для школьников. Решений можно слать много, уже несколько лет можно узнать результаты проверки прямо на контесте и в случае фейла засабмитить с еще одним костылём. К сожалению, чтобы не превращать в ACM, были придуманы токены — две шняги с регеном в полчаса, которые сообщают полные резы (без них доступно только на части тестов). Количество баллов за задачу зависит от количества пройденных тестов (максимальное = 100, иногда дотягивают до 110).

Topcoder algorithm — для всех желающих. Уникально тем, что вполне полноценно можно играть в одном java-клиенте и не имея у себя никаких компиляторов. Проверка же решений неинтерактивная, то есть о фейле можно узнать в самом конце. Есть веселая возможность попытаться сфейлить решение другого участника, скормив ему неудобоваримые входные данные (но соответствующие условию задачи). Алсо, самый благоприятный для читеров формат.

Google Code Jam — участники получают на каждую попытку рандомно сгенерированный тест и прогоняют его у себя. Поэтому можно использовать почти любой язык.

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

Кто соснул? — тоже командная игра, но уже нацеленная на школоту. На любимом языке программирования решается некая задача и сравнивается с решениями на ЯП оппонентов. Результат сравнения трактуется в свою пользу. В ход идут подручные предметы. Популярно в /pr/ при подготовке к олимпиадам и просто так.

Работа жюри[править]

Поддерживает работу тестирующей системы, зоопарка компиляторов, пишет задачи, тесты и эталонные решения к задачам, а также отвечает на вопросы участников трёхзначной булевой логикой: YES, NO, NO COMMENT (самый частый ответ). Иногда жюри фейлит и вставляет в набор тесты, не соответствующие условию, и обнаружив это, делает повторное тестирование на исправленном наборе тестов — реджадж. Или не делает.

Личности[править]

Короткевич (справа) второй раз выигрывает ICPC
  • Билл Пучер (Паучер) — бессменный директор ACM ICPC, большой любитель классической музыки.
  • Андрей Станкевич — вице-директор Северо-Западного полуфинала АСМ (Россия и СНГ), призёр финалов ICPC 2000 и 2001 года, и вообще тот, на ком сейчас держится вся подготовка команд ИТМО.
  • Геннадий Короткевич aka tourist — студент ИТМО из Бульбостана, выступающий за Россию. Обычно считается самым сильным олимпиадником, что подтверждают запредельный рейтинг на этих ваших Codeforces и первые места на IOI, ICPC, Google Code Jam, VK Cup, Topcoder Open, Яндекс. Алгоритм и т. д. и т. п. А чем можешь похвастаться ты, юный падаван?
  • Пётр Митричев aka Petr — до прихода Гены был однозначно лучшим (40+ фактов о Пете Митричеве), но вопрос о том, кто сильнейший, ещё открыт. Обе попытки в финалах ACM ICPC частично зафейлил: команда МГУ занимала 2-е места.
  • Снарк — имеет бороду, ведёт открытый кубок (OpenCup), являющийся зеркалом разноместных онсайт-контестов по правилам ACM, также любитель придумывать новые правила для своих собственных контестов.
  • Владислав Исенбаев aka Winger — студент ИТМО, победивший в финале ACM 2009 года и зафейливший две последующие попытки попасть в финал, проиграв другой команде собственного университета.
  • Степан Гатилов — студент НГУ, получивший у Медведева отмазку за пропуски инъяза
  • Томек Чайка — пшек. Выигрывал как Topcoder Open, так и ACM ICPC. Один из участников знаменитой сумасшедшей IT вечеринки (фотография сделана в 1997 году в польском математическом лагере, собравшем победителей региональных математических олимпиад для подготовки к международным олимпиадам).
  • Кирилл Василевский aka Ferlon — яркий пример фимоза на почве задротства.

Холиворы[править]

  • могут ли олимпиадники заниматься настоящим программированием?
  • нужна ли популяризация олимпиадного программирования?
  • нужно ли использовать макросы?
Аргументы за
  • Алгоритмы нужны для разработки чего-то большого и нового. Такую систему, как поиск гугла, невозможно спроектировать с помощью обычных приёмов декомпозиции и паттернов программирования.
  • Не удивительно потому, так как крупные корпорации уделяют особое внимание этим соревнованиям и самим олимпиадникам. Победители мировых олимпиад 2000 и 2001 годов Андрей Лопатин и Николай Дуров работали на благо этого вашего Вконтактика.
  • Алгоритмы это наше всё!!!!1111расрас
Против
  • Олимпиадные задачи могут вообще не иметь никакого отношения к практическому программированию. Например, решение может сводиться к вычислению аналитического выражения или выводу на печать константы (да-да, и такое бывает), то есть к области чистой математики. Как правило код, написанный олимпиадниками никто, включая самого автора, потом не поймёт. В серьёзном промышленном программировании, понятный и сопровождаемый код с чёткой архитектурой ценится несравненно выше чем замысловатый и в разы более быстрый, так как зачастую стоимость вычислительных ресурсов ничтожна по сравнению со стоимостью разработки и поддержки. Кроме того оптимизировать, например писать ассемблерные вставки или использовать нетривиальные алгоритмы, имеет смысл только отлаженный код и только в узких местах.
  • Задачи, имеющие отношение к компьютерной тематике (например формат PCX или скан-коды клавиатуры) часто содержат ошибки, что как бы намекает на плохие познания авторов в компьютерах.
  • Ряд задач сводится к тому, чтобы закодить алгоритм, который есть в учебнике, но которого нет в стандартной библиотеке (типа максимального паросочетания или минимального разреза).
  • Решения олимпиадных задач очень короткие (обычно менее 200 строк), которые можно отладить с помощью грубой силы, напильника и кувалды.
  • Для решения используются самые базовые средства, чтобы сделать соревнования доступными для как можно большего числа участников. Поэтому можно даже не знать язык, на котором пишешь.
  • Заюзать какую-нибудь стороннюю библиотеку хер получится. Алсо, с этим связан фап на java BigInteger, пусть и неудобный, но доступный из коробки (в связи с этим авторы изобретают особо хитрожопые задачи, где длинная арифметика есть, а этот класс бесполезен; давать задачи, где очевидно применение BigInteger считается моветоном).
  • О звёздах прошлого обычно ничего примечательного неизвестно, разве только они переходят из участников в жюри. Вероятнее всего, у этого есть свои причины. Так Николай Дуров (брат того самого) сам убрал себя из списка создателей Контакта (возможно, опасаясь славы и троллей).
  • Этот ваш ИИ вполне себе успешно решает олимпудерские задачи, что свидетельствует о шаблонности и необходимости распознавать паттерны, а не думать головой.

Фабулы условий задач[править]

К каждой задаче обычно придумывают сюжет. Иногда сюжет для уже готовых задач ВНЕЗАПНО меняют перед самым контестом, доставляя немало сюрпризов читающему её. Сюжет как правило не имеет с содержанием ничего общего, а также вводит в заблуждение Медведева.

Примеры
Штирлиц и Мюллер играют в занятную игру, стреляя по очереди. После каждого выстрела кто-нибудь в очереди умирает. Если у еврея не осталось соседей, он в ужасе сам накладывает на себя руки. Пусть в очереди изначально было N человек и Штирлиц хочет убить последнего. Сможет ли он это сделать, если оба игрока будут действовать наилучшим образом?
Организация «Кот в танке» хочет захватить мир. Но у них возникла проблема…

Внимательный читатель может заметить, что «Кот в танке» — анаграмма одного хорошо известного в этой стране сайта ВКонтакте

Вам дано дерево, сплошь усеянное бобрами. … «Боброжуй-0xFF» работает по следующему принципу: находясь в некоторой вершине u, он может перейти к вершине v, если они соединены ребром, и съесть ровно одного бобра из тех, что находятся в вершине v.
Гарантируется, что бобры будут находиться в шоке от происходящего, поэтому не смогут перемещаться по дереву.

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

Была на одном соревновании задача, в которой авторы сумели особенно отличиться: «В этой задаче нет лихо закрученной формулировки, за уши притянутой к деятельности фирмы СКБ Контур. Более того, в этой задаче вообще нет формулировки».

Ну и клюква иногда тоже встречается, куда ж без неё.

Галерея[править]

Серверы[править]

См. также[править]

App.png Весьма полезная вещь, позволяет машинам работать с помощью коммандычей
МетаПрограммаDRM (SecuROMStarForceАналоговая дыра) • БагБот (Автоответчик) • Варез (Repack) • ГлюкГуйДонатКопирайт (By design) • ЛогНюкРут (Не работай под рутом) • Спортивное программированиеМегапиксельКомпьютерВерсия 2.0КодОбфускацияСкриншотДатамайнПлагинТекстовый файлБольшие данныеАльфа и бета-тестыТаймстампКэшШаблоныHello WorldНейросетиФайлИнсталляцияВидеоМощный сбой Microsoft 19 июля 2024 годаCrowdStrikeПроект GNUUserscriptDxvkVkd3dБратан хорош давай давай впередКонечный автоматLumen
ФичиБагрепорт12309BSODCookiesEmbrace, extend and extinguishFL StudioSheep.exeWinlogon.exeБубенЗащита от дуракаКостыльМашинный переводПасхальные яйцаСвистелки и перделкиСм. рис. 1Съешь ещё этих мягких французских булокTermuxGNU MetroИндусский кодНескучные обои • Сжатие (За сжатие ДжипегаШакалШкала) • Работает — не трогайРандомайзерPDF (Распознавание PDF) • Дело Google в ФАСЧат-ботXMLМакросКритическая ошибкаФреймворкСинонимайзерSourceТрёхмерное отслеживаниеТрассировка фотоновHZB OcclusionДаунгрейд RTX 4070TressFXАвтопереводчик
ВредоносноеБотнетБрутфорсВинлокЗвонилкаКитайские пингвиныПиксель смертиТроянЧервь МоррисаBonziBuddyMediaGetBrowser hijackingTinderМиссис МажорУтечка буфера обменаWin 10 TweakerОпараш Mozilla FirefoxЯндекс.МузыкаКрэкерБезопасность через умолчаниеGrifter.aviTrojan.Winlock.DeathМиссис МажорСредаDirectStorageDriverpackГенератор случайных чиселDisable Core 0РомхакингDDrawCompatWingetCreateWinGetCoowonЯндекс МессенджерVCPkgSELinux
КомпанииApple / Apple (AppleScript) • GoogleMicrosoftSAPЯндекс
Движения8-bitOpen source (КрасноглазикиЛинуксоиды) • Вирусная сценаДаунгрейдДемосценаМоддингMMDDirectDrawЛагиБлокировка Дискорда в РоссииOpera GXНесоответствие MIME-типаRenoisePygameLs (UNIX)МетаданныеПатчNginxПиксельЭмуляторSearxТамТамMallocСвязный списокSOLID
Офис3DS MAXGIMPGNU EmacsMovie MakerMS Paint • OpenOffice • PowerPointviMicrosoft WordExcelБлокнотФотошопАнтивирус КасперскогоAvast!TikZShareXAlternativeToСкрепышMicrosoft OfficeТекстовый редакторWeChatZoomДиспетчер задачMicrosoft CortanaWinampBallonTranslatorKerish DoctorОбщая ошибкаFirefox: Как один баг сломал весь YouTubeМеждулициеMeld StudioLadybirdCheat Engine
ОСAndroidBSDDOSMenuetOSReactOSWindows (Phone 7Phone 878Vista) / МаздайЛинуксРусская ОСФантом ОСIndex.php
БраузерыInternet ExplorerОпера / Opera • Тормозилла (ОгнелисLolifoxMozilla FirefoxFirefoxFirefox Klar) • Хром (шпионаж) • SafariЯндекс.БраузерУведомления в браузереVivaldiTor-браузерЗосимаФронтенд
ИнтернетAdobe Systems (Flash) • I2PLow Orbit Ion CannonTorTunatic • Чат−клиенты (MirandaQIPSkypeЖабберDiscordVIPole) • HTTPSПрокси-сервер (Proxifier) • Торрент (Magnet-ссылкаΜTorrent) • JavaScriptCSSHTMLБаннермейкерИзменение TTL сетевых пакетовКапчаICQFiddlerViberZonaSteamSillyTavernWickr Me
РазработкаBrainFuckCC++C#JavaHaskellАссемблерChaos ConstructionsBATMySQLGitHubAutoHotKey (AutoHotInterception) • Sublime TextAPK (APKPureзапрет) • BASICPerlPythonPHPФоркUnity3DSAISIPСАПРФлагUTAUФласк макросАуработRaidCallAdobe MingОфициальный™ список кошерных программDevOpsНиколай Дуров
ЛюдиВеб-мастерLovinGODБалмерГейтсГенерал ФейлорДжобсМитникПоттерингде РаадтСпольскиСтоллманТорвальдсШахиджанянAche666Марк ЦукербергЕвгений ПоповДенис КумпонМассовая компьютерная безграмотность
КостылиCygwin • PunkBusterT9WineWishmasterАнтивирусыХакинтошСборки WindowsDenuvoЧистая установкаКалькулятор Consul WarMicrosoft StoreUBlock OriginLightshotAdBlockSearchApp.exeCPU-ZГуглPhotoshopКаптча с пчёламиВзлом Windows через Metasploit
Команды^H^WAlt+F4Ctrl+Alt+Delman/me/quitrm -rf
Medal.jpg Спорт полезен, если в меру
МетаAdidasLet's get ready to rumble!Букмекерская контораОлимпиада (Ванкувер 2010Московская ОлимпиадаСочи 2014Специальная Олимпиада) • Перлы комментаторовРеспект таким парнямФанаты (Remi GaillardЕгор Свиридов) • Фитнес-центрХоккейСпортсменВыстрелить себе в ногуБольшой спортЛыжный спортКачалкаФитоняшкиТурничокСпортЧМ по бобслею в СочиБой Джейка Пола с Майком Тайсоном (2024)
СуицидальныйАльпинизмДайвингПарашютизмПарапланеризмСноубордКайтсерфингБаскетбол
Боевые искусстваАйкидоБоксБрюс ЛиВалуевДацикКочергинСхватка двух йокодзунТайсонМихалокСпортивная борьбаБесконтактный бойСаберфайтингКимураРестлинг-династииДивыПрочий рестлинг-персоналРестлинг-словарьMixfightМетание коровьих лепешекРестлеры (old school)Рестлинг-командыМухаммед Али
Возня вокруг мячейru_footballВувузелаЗиданМоуриньюНогомячРоссийский футболФутбольный хулиганChampionat.com (Чемпионат.ру) • Яо МинРегбиФутболистЗвезда футболаМанчестер ЮнайтедЕвро 2020Сборная России по футболуFootball.ua
Авто/мото/велоDTMNASCARВелоспортМонстр-тракМотоспортРаллиФормула-1Дрифт
МыслеспортMagic: The GatheringSpeedcubingГоПокерПреферансСпортивное программирование (Демосцена) • Что? Где? Когда?/Спортивное ЧГК (АгняшаБарщевскийВассерманДрузьЖарковГладиолус) • СнукерШахматы (Известные шахматисты)
Ритм-спортDDRPIUРитмическая гимнастикаХастлХудожественная гимнастикаБег с высоким подниманием ведраДоктор Джерри Грэм
Недо-спортБодибилдинг (НевскийТурчинскийШварценеггерВиталий ОреховDo4a) • БотинкометаниеГеокешингДворовые игрыКроухантингКрысингЛитрболПаркурРестлинг (Масаки СумитаниРестлеры) • РыбалкаСкейтингДиггерство / Сталкерcтво / РуфингСтрайкбол / Пейнтбол / ХардболСтритрейсингТурникмен/ТурникменыЭкстремальные городские игрыЭлектричкинг (Метроэлектричкинг) • КачкиТуристAIRSOFT BALANСинтольщикиВсё на свете есть бобслейХоббихорсингКвадроберы
ЛюдиСтанислав ЧерчесовМиша МавашиТесакДенис ЧеревичникОскар ПисториусЛионель МессиКамила ВалиеваТрансы в спортеРой ДжонсЮлия ЕфимоваДенис МининКейн (рестлер)БацькаЕвгемия ЛиЛеонид Ионович УсвяцовЕлена ИсинбаеваКирилл ТерешинОблич ЗапливушкоМихаил ЛитвинХабиб НурмагомедовАртем АванесянЛегион БревенПолина БаскаковаГавиЛера ЛогуноваДмитрий ВаргунинГробовщикШон МайклзСемья фон ЭрихСемья ГрэмСтив ОстинРодди ПайперХалк ХоганАлина КабаеваЮля Брат и ПчёлыДжефф МонсонЮлия ЛипницкаяМарадонаАлександр БубновПравославные бойцыБратья КличкоФизрукРокки БальбоаВеликолепный ДжорджАнтон Мороз
Скандалы и событияFan IDЧемпионат мира по футболу в КатареУдар головой ЗиданаДопинг-скандал с участием РоссииДопинг-скандал вокруг российского спортаОтстранение России от участия в международных соревнованияхПод нейтральным флагомПобеда Валиевой на допинг-скандалеМельдонийЧетырёхлетняя дисквалификация Камилы ВалиевойВоруй и забивай!Лец ми спик фром май харт ин инглишЖульничество в шахматахЛетние Олимпийские игры 2024Странная карточкаЦеремония открытия Олимпиады в СочиДеградация спорта в РоссииЗмея на футбольном поле
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++Scala
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автомат
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур Пейперт
Прочее++i + ++iDeadline%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодач