Блог пользователя dkirienko

Автор dkirienko, история, 22 месяца назад, По-русски

Поскольку Тинькофф делает очень много для развития спортивного программирования как среди школьников, так и среди студентов, я слежу за их мероприятиями. И вот тут попалось объявление о наборе на дистанционный курс «Golang для начинающих», анонсированный как «для всех желающих». Несмотря на то, что я далёк от промышленной разработки, иногда возникает желание изучить что-то современное-полезное. Чтобы быть в курсе, возможно, что-то можно будет и в преподавательской работе применить. Однако, просто так садиться и абстрактно что-то изучать — сложно, непонятно как, нет стимула (скажем, в сторону Java я смотрю лет 20, думая «неплохо бы разобраться», но какого-либо реального стимула изучать Java за 20 лет так и не появилось). Но тут курс, на котором будут какие-то сроки и задания — о, это здорово, хочу! А поскольку курс объявлен для всех желающих, то — о, я желающий, наверное, это для меня!

Итак, я подал заявку на курс, дальнейшее оказалось очень не очень, поэтому хочу об этом рассказать.

Для отбора на курс нужно сделать две вещи — заполнить анкету и решить контест. Анкета более-менее стандартная — биографические сведения, образование, место работы, опыт. Участие в олимпиадах тоже приветствуется. Равно как и опыт их проведения. Честно пишу, хотя, вероятно, по части «Возможно, вы были волонтером на олимпиаде» я для них Overqualified. Но это компенсируется тем, что по части промышленной разработки я скорее Underqualified. Но самое интересное — это контест.

На контест отводится неделя, виртуальный турнир на три часа. Поскольку я был сильно желающим, то бросился решать задачи в первый же день контеста. Да ещё и интересно было — что же за контест такой для отбора на начальный курс по промышленной разработке на Go?

В контесте было шесть задач. Языки программирования — все наиболее распространённые. Тестирование — оффлайн, нужно, чтобы задача прошла все тесты, но во время тура тестируется только на первом тесте (даже если в условии несколько примеров, всё равно тестируется только на первом). Показывается только статус прохождения первого теста, без подробного протокола (входные данные, вывод, правильный ответ).

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

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

Но по ходу решения задач в глаза бросается крайне низкое качество подготовки этих задач. Как бы задачи олимпиадные, но давать на любой олимпиаде настолько плохо подготовленные задачи — это позор. А именно, я нашёл следующие проблемы с задачами:

а) в одной задаче в условии написано, что входные числа записаны в разных строках, на самом деле они записаны в одной строке. И в примерах в условии они записаны в разных строках, но на самом деле в тестах — они в одной строке! Понятно это становится, когда ты пишешь считывание данных на питоне, и получает Runtime на первом тесте. Поскольку Runtime получить там негде, то подумав и обратив внимание на то, что в других задачах входные числа даются в одной строке, переписываешь считывание данных и получаешь Accepted (на первом тесте по крайней мере). А полного протокола на тестах из условия нет, нужно самому догадаться, что Runtime — это потому что тесты не соответствуют условию.

б) В пятой задаче дано дерево из n вершин и после этого выполняется q операций, каждая затрагивает поддерево. Нужно вывести результат после выполнения операций. В условии написано, что n <= 100.000, а вот на значение q в условии нет никаких ограничений! То есть непонятно, можно ли писать обработку одной операции за O(n) с суммарной сложностью O(nq). Ну тут профессионалы должны догадаться, что операцию можно обрабатывать за O(1), поэтому предполагается (наверное) решение за O(n+q), но формально это никак не следует из условия. Попробуй догадайся, о чём речь.

в) Условие задачи 2 крайне невнятно сформулировано, я его не понял с первого раза, и даже отложил задачу. Вернулся к ней позже, и уже изучая примеры и глядя на примеры «подогнал условие под примеры». Можно было бы условие написать гораздо лучше.

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

После окончания контеста, я сажусь и пишу письмо им на почту с подробным изложением всех проблем. И…. в ответ ничего! По истечение почти трёх недель никакого ответа на письмо хотя бы в виде «Спасибо, учтём все предложения!» не последовало.

Ну вот прошёл срок проведения тестирования, результаты должны быть объявлены 17 февраля, и в этот день приходит на почту письмо следующего текста: «Спасибо за интерес к нашим программам. Мы проверили ответы всех участников. К сожалению, в этот раз вы не прошли на направление «Go. Для всех желающих». Информацию о результатах добавили в личный кабинет.»

Поскольку мне кажется, что пяти решённых задач из шести в профессиональном контесте должно быть достаточно (ну не крутейших олимпиадников они на такой курс набирают), становится понятно, что не взяли меня потому что я не такой желающий, какой им нужен. Наверное, надо было закосить под простого студента, а не честно писать свою биографию. Но хочется посмотреть, что же там за результаты такие, хотя бы сколько задач я решил в итоге? Тестирование то было оффлайн, то есть после объявления результатов хочется какие-то протоколы проверки увидеть. Хотя бы узнать, правильно ли были решены задачи.

Захожу в личный кабинет, и что я вижу там? Краткое сообщение — «К сожалению, в этот раз вы не прошли. Попробуйте свои силы в следующем отборе». Это я и так знал из письма, но что же с контестом? А там по-прежнему написано «Результаты будут 17 февраля», вот и всё, что я знаю о сданных задачах. По-видимому, они просто забыли нажать кнопочку "опубликовать протоколы проверки".

Моя учительская оценка: не знаю, что там с содержанием курсов, но организационные процессы в «Тинькофф Образование» не дотягивают до «хорошо».

Полный текст и комментарии »

  • Проголосовать: нравится
  • +245
  • Проголосовать: не нравится

Автор dkirienko, история, 3 года назад, По-русски

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

Организация

Формально по порядку проведения ВсОШ за проведение школьного этапа отвечают муниципалитеты, поэтому уровень организации школьного этапа зачастую оставляет желать лучшего, а местами он и вообще не проводится. Образовательный центр "Сириус" взялся организовать школьный этап всероссийской олимпиады по шести предметам — математике, информатике, физике, химии, биологии, астрономии. В прошлом году была апробация для шести регионов. В этом году было предложено присоединиться всем регионам, "подписаться" можно было только на комплект из шести предметов.

Согласились почти все — проще перечислить регионы, которые не участвовали и решили проводить школьный этап самостоятельно (по убыванию численности населения): Московская область, Красноярский край, Вологодская область, Алтайский край, Омская область, Республика Крым, Пермский край, Пензенская область, Тверская область, Забайкальский край, Амурская область, Республика Марий Эл, Республика Карелия, Новгородская область, Республика Хакасия, Республика Ингушетия, Республика Алтай, Чукотский автономный округ, Ненецкий автономный округ. Я не включил в этот список Москву — хотя она и не "подписалась" на проект, но всё равно школьный этап по информатике для Москвы проводился по тем же заданиями и тем же правилам. На самом деле наоборот — правила и принципы составления задания были взяты московские, и московский формат проведения школьного этапа олимпиады по информатике был распространён на всю страну.

Всего вместе с Москвой участвовало свыше 80% регионов России (если считать по численности населения).

Все регионы были разбиты на четыре группы, примерно равной по численности населения, расположенные примерно в одних часовых поясах. Первая и вторая группы — это московский часовой пояс, третья группа — это MSK+1 и MSK+2, четвёртая группа — от MSK+4 до MSK+9. Тут я (и многие коллеги) впервые узнали, что в зоне MSK+3 находится всего лишь один регион — Омская область, которая не участвовала в проекте. Для каждой группы был установлен свой день проведения — с 26 по 29 октября.

Регион самостоятельно определял форму проведения школьного этапа: централизованно в школах или из дома. Логины для участия распространялись по школам через ФИС ОКО (федеральная информационная система оценки качества образования). Школам выдавались логины по числу учащихся +10% запаса. Регламент проведения олимпиады предусматривал возможность участия с 8 до 20 часов по местному времени, реально же возможность участия была от 8 утра в самом раннем регионе до 20 часов в самом позднем.

Авторы заданий

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

Содержание заданий

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

Для 9-11 классов предлагалось 5 задач по программированию на двухчасовой тур. Примерный план варианта — формула (целочисленная арифметика), задача на использование if, задача на цикл, задача на массив, идейная задача. Система оценивания — потестовая, все тесты независимые, хотя в условиях и выделяются подзадачи по ограничениям или частным случаям, но групп тестов и зависимостей между тестами нет. Тестирование производилось сразу после сдачи на всех тестах. Задачи доступны в тренировках: первая группа, вторая группа, третья группа, четвёртая группа.

Для 7-8 классов предлагался смешанный вариант. Статистика показывает, что лишь небольшая часть школьников 7-8 классов, участвующих в олимпиаде, умеет программировать (например, статистика этого школьного этапа — около 10% участников сдавало задачи по программированию), поэтому участникам предлагается 4 задачи с вводом ответа и 3 задачи по программированию. Задачи с вводом ответа — это по сути output-only задачи, которые, скорее всего, можно решить без использования компьютера (но не запрещается и его использование). Ответ на эти задачи нужно записать в поле ввода. Это похоже на формат олимпиад по математике в дистанционной форме, но, благодаря чекеру, можно выставлять произвольные баллы за решения, например, оценивать алгоритм для исполнителя по числу использованных команд. Об этом формате проведения олимпиады было опубликовано несколько статей. При этом считается, что 7 задач много для тура, а школьники могут выбирать понравившиеся задачи, поэтому оцениваются только 5 задач из 7 с наилучшим результатом. Продолжительность тура — 2 часа.

При этом сильные программирующие школьники 7-8 классов могли писать олимпиаду за 9 класс.

Для 5-6 классов предлагался вариант без программирования, только из 5 output-only задач. Продолжительность тура — 45 минут.

Условия задач, решения, архивы и видеоразборы опубликованы: группа 1, группа 2, группа 3, группа 4.

Тестирующая система

Тестирующая система должна удовлетворять ряду требований: держать несколько десятков тысяч пользователей одновременно, справляться с проверкой задач по программированию (в пиковые моменты использовалось порядка 40 инвокеров. Это на самом деле не очень много, т.к. при составлении задач было требование не делать много тестов, да и TL больше 1 секунды в задачах не было), поддерживать output-only задачи со сдачей ответа в поле ввода. И редкие системы удовлетворяют всем этим требованиям.

Для проведения дистанционных олимпиад по другим предметам Сириус использует собственную тестируюущую систему. Она специально была разработана для проведения подобных мероприятий, поэтому там довольно просто реализован механизм входа и регистрации (вместо пары логин-пароль используется один "ключ", затем нужно ввести фамилию-имя и можно переходить к олимпиаде) и умеет держать нужную нагрузку. В ней уже есть поддержка задач по программированию и проведены соревнования на несколько сотен участников, однако, на соревнованиях по программированию на тысячах участников система ещё не использовалась. Кроме того, поддержка output-only задач в настоящий момент не достигла нужного нам уровня, например, нет возможности выставлять в качестве оценки за решение произвольное число от 0 до 100. Поэтому от использования системы Сириуса пришлось отказаться, но я надеюсь, что в дальнейшем мы будем использовать её.

Codeforces хоть и умеет держать нужное количество пользователей (если считать число участников Div.3 раундов, которое превышает 20.000, что примерно нам и нужно), но совсем не поддерживает output-only задачи.

Яндекс-контест мы пробовали использовать в прошлом году в ходе пилотного проведения школьного этапа для нескольких регионов, с его помощью можно добиться желаемого формата проведения олимпиады, однако, это весьма неудобно делать. Например, ввод фамилии-имени участника при регистрации осуществлялся при помощи добавления в контест "нулевой" задачи, без сдачи которой нельзя перейти к следующим задачам, а это усложняет подведение результатов (нужно отдельно выгружать архив сабмитов, считывать его программно и сливать с таблицей результатов). Задачи вида output-only приходится проверять повторно после окончания тура с заменой чекера. Все массовые операции вида "создать пользователей", "выгрузить архив решений", "провести перетестирование" требуют привлечения поддержки и занимают очень много времени. Наконец, не было уверенности в том, что Яндекс.Контест сможет успешно поддерживать столько пользователей.

Поэтому использовался ejudge, который много лет использовался для проведения олимпиад в Москве. Отдельная благодарность автору ejudge Александру Чернову за систему и регулярные консультации.

Ejudge, разумеется, имеет ряд недостатков, связанных прежде всего с тем, что система разрабатывается более 20 лет и её архитектура соответствует взглядам 20-летней давности. При разработке ejudge просто не закладывалась идея, что в контесте могут быть десятки тысяч одновременных пользователей и сотни тысяч пользователей всего. Все пользовательские запросы, например, обрабатываются процессом ej-contests, который работает в один поток и никак не распараллеливается. Поэтому, кажется, предел возможностей ejudge — это около 4000 одновременных пользователей на мощном компьютере, при большем числе пользователей ej-contests уже не успевает обрабатывать запросы пользователей.

В ejudge плохо организована работа с базой пользователей, например, запуск контеста (и выполнение действия reload config files) влечёт считывание всей базы пользователей в память, что занимает ощутимое время и требует оперативной памяти для хранения ненужной базы пользователей.

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

#define EJ_MAX_USER_ID  999999
#define MAX_USER_ID_32DIGITS 4

Последняя строчка ограничивает размер поля для хранения USER_ID 20 битами. При этом для проведения школьного этапа в этом году было сгенерировано порядка 10 миллионов логинов в систему. В принципе, можно с этими ограничениями справиться, но для этого, например, понадобится перекомпиляция ejudge.

Зато система ejudge проверена и предсказуема. Известно, что один сервер ejudge может держать 3000 одновременных пользователей, и распределить нагрузку можно созданием отдельных серверов так, чтобы на каждый из них приходилось не более 3.000 одновременных пользователей (и около 15.000 пользователей за день проведения тура).

Поэтому для проведения олимпиады использовалось несколько независимых серверов так, чтобы ожидаемое максимальное число пользователей составляло порядка 2000 на одном сервере. Каждая из четырёх групп регионов разбивалась на подгруппы по ожидаемому числу участников: первая и третья группы были разбиты на две подгруппы, вторая группа — на три подгруппы, четвёртую восточную группу разбивать не пришлось. Итого получилось 8 подгрупп и 24 сервера (для групп классов также использовались отдельные сервера), плюс 3 сервера для Москвы. Но для проведения туров одновременно использовались только сервера одной группы, то есть при проведении школьного этапа для второй группы + Москвы было задействовано 12 одновременно работающих фронтенд-серверов.

Все сервера находятся в облаке AWS, благодаря чему процесс клонирования серверов довольно прост.

Таким образом, для участия в олимпиаде школьник должен иметь помимо логина и пароля ещё и ссылку на вход в тестирующую систему, которая разная для разных серверов. Для этого мы в последние годы используем сервис сокращения ссылок to.click, которому мы благодарны за поддержку и всяческую помощь.

Проблемы

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

Проблемы с серьёзными DDOS-атаками в последние годы возникали у организаторов школьного этапа в Московской области, я же некоторое время считал, что лучший способ защиты от DDOS-атак — это просто хранить в секрете адреса серверов, не публикуя ссылки на вход в тестирующую систему в открытом доступе. Но при увеличении масштаба мероприятия этот метод перестал работать. Впервые c DDOS-атакой при проведении школьного этапа мы столкнулись год назад, тогда без видимых причин выросла нагрузка на CPU и сеть на одном из серверов и происходило ощутимое замедление отклика сервера (это было год назад на московском сервере для олимпиады 9-11 классов), но точно идентифицировать атаку по логам не удалось.

На этот раз первая DDOS-атака началась 27 октября в 20:00. В это время заканчивался тур для Москвы, поскольку для регионов проведение тура по регламенту до 20:00. Атака заключалась в загрузке страницы входа в систему, в минуту число запросов доходило до 2 миллионов. По примеру Московской области, сервера тестирующей системы находились за Cloudflare, который распознал атаку и успешно блокировал запросы, т.е. тестирующая система продолжала работать. Но часть участников (по-видимому, те участники, у которых массово совпадали IP-адреса) также были "распознаны" Cloudflare, как атака, и им тоже был заблокирован доступ в тестирующую систему. То есть Cloudflare начал "спасать" тестирующую систему от DDOS-атаки, блокируя доступ к тестирующим серверам не только атакующим, но и некоторым участникам. Такое поведение CloudFlare oказалось сюрпризом.

Вторая DDOS-атака случилась 28 октября, когда шли туры для третьей группы регионов, в 13:13 по московскому времени (если "автор" этой атаки читает этот пост, то да, мы "оценили" его шутку). Она была гораздо более длительной и продолжалась свыше 5 часов. Кажется, что вторая атака не связана с первой — первая была направлена на московский сервер, здесь атака шла на сервер для регионов. Но сценарий оказался таким же — Cloudflare начал блокировать атаку и часть участников. По моим оценкам, трудности доступа к тестирующей системе из-за блокировки Cloudflare возникли у 30% участников олимпиады, для остальных же тур продолжался, т.к. с самой тестирующей системой проблем не было.

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

Списывания

При таком формате проведения олимпиады задания сливаются в интернет в течение первого часа, а вскоре появляются и их решения. Главный вред этого в том, что большое число копи-пастеров вытесняют из верхней части таблицы результатов честных участников и не дают им возможности пройти на муниципальный этап, поскольку число участников муниципального этапа ограничено. Возникает необходимость в очистке результатов от "мусорных" участников. Но стандартные алгоритмы, которые используются на подобных соревнованиях (предполагающие попарное сравнение подозрительных решений членом жюри), здесь не сработают, потому что решений и списываний очень много, сравнивать попарно решения нет никакой возможности. Да и сценарий списываний тут другой — есть некоторое количество решений, которые были слиты в интернет, и участники сдавали эти решения, как правило, без каких либо модификаций. Хотя несущественные модификации возникают, например, при копи-пасте решений появляются лишние пустые строки (между двумя строками кода есть одна пустая строка, что сразу бросается в глаза). Другой типичный пример списывания: на одном популярном сайте примеры кода верстаются в виде таблицы, где в левом столбце — номера строк, а в правом столбце — код. При копировании решений с этого сайта участники зачастую копируют и номера строк из левого столбца, получается такая программа:

1
2
3
4
5
6
7
N = int(input())
K = int(input())
if 1 <= N <= 10 ** 4:
    if (1 <= K <= N) and ((N % K) == 0):
        print(2 * N * (N // K - 1))
else:
    print(0)

Но этот код является корректным кодом на Python и набирает столько же баллов!

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

Печальная статистика заключается в том, что в целом по стране среди участников 9-11 классов, которые набрали больше 0 баллов, минимум 58% использовало чужие решения (это только то, что удалось найти поверхностной проверкой). Доля "списывальщиков" разнится от региона к региону, в отдельных регионах доходя до 90% участников.

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

Статистика

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

Всего участников 5-6 классов: 106311

Ненулевых участников 5-6 классов: 74195

Всего участников 7-8 классов: 132682

Ненулевых участников 7-8 классов: 86166

Число участников 9-11 классов: 153267

Ненулевых участников 9-11 классов: 49097

Невысокое число ненулевых участников в 9-11 классах объясняется проведённой проверкой на списывание.

Публикую два файла со статистикой (нажмите на кнопку "Скачать" вверху страницы после перехода по ссылке).

  1. Число участников по регионам в каждой группе. Здесь также считаются только ненулевые участники. Также там посчитана доля участников в 7-8 классах, которые умеют программировать (набрали больше нуля на задачах по программированию).

  2. Статистика по используемым языкам программирования. Учитывается только 9-11 класс, после проверки на списывание. Считается, что участник использовал язык программирования, если набрал больше 0 баллов, сдавая решения на этом языке. А по Москве я веду статистику используемых языков программирования на разных этапах начиная с 2011 года.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +131
  • Проголосовать: не нравится

Автор dkirienko, история, 4 года назад, По-русски

Как и в прошлом году, посчитал статистику по языкам программирования, использованных на прошедшем региональном этапе.

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

В этом году удалось собрать статистику из всех регионов кроме:

  • 06 — Республика Ингушетия
  • 17 — Республика Тыва
  • 18 — Удмуртская республика
  • 19 — Республика Хакасия
  • 51 — Мурманская область
  • 54 — Новосибирская область
  • 74 — Челябинская область
  • 89 — Ямало-Ненецкий автономный округ

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

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

Наиболее заметным изменением в итоговой статистике является то, что количество участников, использующих Python, превысило количество участников, использующих C++.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +66
  • Проголосовать: не нравится

Автор dkirienko, история, 5 лет назад, По-русски

Как и в прошлом году, посчитал статистику по языкам программирования, использованных на прошедшем региональном этапе.

В этой таблице собрана информация за этот и 2019 год. Пройдя по ссылке, нажмите на кнопку "Скачать" вверху страницы.

Удалось собрать сведения из 79 регионов + Сириуса. Список регионов, которые не охвачены статистикой в этом году:

  • 17 — Республика Тыва
  • 19 — Республика Хакасия
  • 28 — Амурская область
  • 51 — Мурманская область
  • 57 — Орловская область
  • 74 — Челябинская область

Все прочие подробности, в целом, как и в прошлом году.

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

Полный текст и комментарии »

  • Проголосовать: нравится
  • +33
  • Проголосовать: не нравится

Автор dkirienko, 5 лет назад, По-русски

В проект перечня олимпиад школьников, которые могут давать льготы при поступлении в вуз, вновь добавлена олимпиада "Бельчонок", которая уже когда-то была в перечне, потом оттуда её убрали. Олимпиада проводится Сибирским федеральным университетом (Красноярск). Раньше это была "бланковая" олимпиада, то есть решения задач пишутся на бумаге, а потом проверяются жюри, хотя все широко известные олимпиады по информатике из перечня РСОШ проводятся исключительно в компьютерной форме. Мне стало интересно, что же представляет эта олимпиада сейчас, если её повторно включили в перечень. Благо сайт олимпиады http://dovuz.sfu-kras.ru/belchonok/ должен содержать массу материалов для анализа.

Конечно же, интерес прежде всего представляют задания заключительного этапа для 11 класса.

Первые четыре задачи — задачи по математике (безыдейная вычислительно муторная комбинаторика, задача на системы счисления, просто задача уровня маткружка и только в задаче 4 есть слово "бит", а сама задача в стиле известной задачи из ЕГЭ по информатике). Но есть и пятая задача, которая внешне выглядит, как адекватная задача по программированию. Приведём условие задачи полностью:

Дано N натуральных чисел. Написать программу, находящую минимальное натуральное число, не представимое в виде суммы никаких из этих чисел, если в эту сумму каждое исходное число может входить не более одного раза. Также сумма может состоять из одного числа.

Входные данные: первой строкой подается количество чисел N, второй строкой сами числа через пробел.

Выходные данные: искомое число.

Пример:

Входные данные Выходные данные
5
1 2 3 4 5
16
1
1
2

На первый взгляд задача уже выглядит похоже на задачу по программированию, достойную олимпиады. Правда, задача не блещет оригинальностью (хотя задания для заключительных этапов олимпиад РСОШ должны быть оригинальными), я даю эту задачу в школе 8-классникам (см. например задача Q). Это несложное упражнение на сортировку, нужно упорядочить список чисел, считать суммы всех чисел на префиксах, если какое-то число будет больше, чем сумма всех предыдущих чисел, увеличенная на 1, то ответом будет как раз сумма предыдущих чисел, увеличенная на 1. Сложность решения: O(N * log(N)). Вот, например, моё решение этой задачи. Обосновать этот алгоритм несложно индукцией по количеству чисел после их сортировки.

Предлагаемое авторами олимпиады решение этой задачи содержится в архиве с условиями в файле "Информатика_11_Ответы.pdf" на страницах 4-5. Во втором варианте заданий заключительного этапа эта задача точно такая же.

Для удобства скопировал код авторского решения на pastebin. Авторский алгоритм решения — посчитаем сумму всех чисел (sum), затем будем делать перебор по ответу: для каждого числа от 1 до sum будем проверять, можно ли представить его в виде подмножества данных чисел, что в свою очередь будем делать перебором всех подмножеств N чисел. То есть сложность авторского решения O(sum * N * 2N).

Но если не получилось придумать хитрое решение с сортировкой, то можно один раз перебрать все подмножества и отметить в массиве числа, которые можно получить, затем найти первое неотмеченное число. Это будет решение сложности O(sum + 2N). А можно решить эту задачу стандартным рюкзаком, это будет решение сложности O(sum * N). Составители заданий олимпиады, похоже, просто не в курсе вопросов сложности алгоритмов и написали самое худшее из очевидно приходящих в голову решений.

Также авторское решение содержит ошибки. В строке 7 объявлена переменная sum, которая не инициализируется. В строке 19 есть вывод переменной sum, но это не ответ, это отладочный вывод. Ответ выводится позже. Авторское решение всегда выводит два числа: сначала сумму всех чисел, потом ответ, то есть в тестирующей системе это всегда будет PE.

Итак, решение а) крайне неэффективно, б) содержит ошибку в реализации, в) содержит отладочный вывод в stdout.

Кроме того, решение ещё и крайне плохо написано.

Например, в строках 27-28 в цикле считается сумма в переменную sum1, а переменная sum1 обнуляется после этого цикла в строке 31. Так писать можно, но плохо, т.к. запутывает код. У своих учеников я такое решение не приму, инициализация должна быть сделана перед циклом. Об этом можно почитать в блоге Петра Калинина.

В строках 42-44 авторского решения нужно вывести найденный ответ i, он выводится, после чего делается break из цикла. А чтобы ответ не был выведен повторно ещё раз после цикла, увеличивается переменная flag1, которая проверяется после цикла (если flag1 == 0, то нужно выводить sum + 1). Вместо использования флагов и break в языке C++ нужно сделать return из середины функции main. Названия переменных (a, b, c, sum. sum1, flag, flag1) я бы никогда не принял у своих учеников.

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

Ну и теперь переходим к самому главному — проверке решений. Уже понятно, что о тестирующей системе речи не идёт, как же они проверяли работы участников? Максимальный балл за вариант составляет 100, из них эта задача оценивается в 30 баллов. Кстати, в начале файла с решениями ошибка, там написано "Общее количество баллов 100. Решение первой задачи оценивается Жюри из 10 баллов, пятой задачи из 30 баллов и из 30 баллов остальных.", на самом деле задачи 2-4 оцениваются в 20 баллов, посчитайте сами сумму. Допустимо ли Жюри (не стесняющемуся писать себя с заглавной буквы) делать столь банальные ляпы в официальных текстах, равно как оставлять отладочный вывод в решении? Но все-таки посмотрим на то, как были проверены работы участников.

Вот работы победителей и призёров олимпиады. Работы учащихся 11-х классов начинаются со страницы 74.

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

Но есть решение Кирилла Курдюкова (см. страницу 98), в котором я не нашёл никаких ошибок и изъянов. Вот это же решение на pastebin. Решение проходит все тесты в моей тестирующей системе и имеет сложность O(N*log(N)). То есть оно правильное, полное, имеет гораздо меньшую алгоритмическую сложность, короче и проще в реализации, то есть за него нужно ставить никак не меньше 30 баллов из 30 (а следовало бы поставить больше, ибо оно гораздо лучше авторского решения).

Жюри оценило это решение в 5 баллов из 30. Дальше есть ещё одна работа, в которой за это задание поставлено целых 10 баллов (во всех остальных работах — не более 5 баллов, как у Кирилла) — это работа Валерии Тягуновой (см. страницу 102). Это решение тоже с сортировкой, но в нём есть ошибки — выход за границу вектора, т.к. в векторе из n элементов идёт обращение по индексам от 1 до n, и также Валерия путает префиксный и постфиксный инкремент, она выводит sum++, а это не увеличенное значение sum, нужно вывести sum + 1. Во всём остальном — алгоритм решения такой же, как у Кирилла, но при наличии ошибок, оно оценено большим числом баллов, чем безошибочное решение Кирилла. Есть и другие решения этой задачи с правильной идеей, но с ошибками в реализации, за них тоже стоит 5 баллов.

Жюри олимпиады по-видимому не поняло правильное решение, которое написали эти школьники, а также не смогло найти банальные ошибки в программах на C++.

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

Ну и организационные вопросы. Заключительный этап проходит в разные дни в разных городах, разница по срокам в неделю. Но у организаторов олимпиады есть два варианта заданий для проведения заключительного этапа! В первом варианте составляем слова из слова "олимпиада", во втором варианте составляем слова из слова "информатика". В первом варианте закрашиваем 15 клеточек, во втором варианте — закрашиваем 11 клеточек точно такой же конструкцией. Ну а задача по программированию везде одинаковая. Вся страна мучается во время регионального этапа, когда Калининград начинает туры в 8 утра, а Чукотка и Камчатка должны детей держать взаперти час после окончания тура, пока Калиниград не запрёт своих участников, а на олимпиаде "Бельчонок" совсем не заморачиваясь просто дают одну и ту же задачу в разных городах через неделю.

Непонятно, зачем СФУ проводит такую олимпиаду и хочет учитывать её результаты при поступлении в вуз. Задания этой олимпиады ничем не лучше заданий ЕГЭ по информатике, а качество работы жюри просто неудовлетворительное. Не знаю, как в Красноярске проверяют ЕГЭ по информатике, но в ЕГЭ по крайней мере на полный балл ожидается именно наиболее эффективное решение, и качество составления заданий ЕГЭ и проработки критериев оценивания заведомо лучше, чем у олимпиады "Бельчонок".

Также отдельным вопросом является качество экспертизы олимпиад, проводимой РСОШ. Каждый год перечень олимпиад и их уровни вызывает недоумение. В перечень попадают олимпиады типа "Бельчонок", "Инфознайка" или "Надежда знергетики", хотя неадекватность проведения этих олимпиад видна после беглого изучения их заданий. Или повторяющаяся история с присвоением первого уровня олимпиаде "Информационные технологии", которая ну никак не дотягивает до других олимпиад РСОШ ни первого, ни второго уровня (в этом году в перечне нет олимпиад второго уровня по информатике, но в те годы, когда Всесибирская олимпиада школьников или олимпиада "Высшая проба" по информатике были второго уровня, олимпиада "Информационные технологии" всегда была первого уровня, хотя они совершенно несопоставимы по сложности заданий). На мой взгляд, "Информационным технологиям" нужно дать третий уровень, а то множество олимпиад по информатике, которым всем сейчас дали первый уровень, вполне можно разделить по сложности на первый и второй уровень. Нынче олимпиада "Информационные технологии" стала называться "Открытая олимпиада школьников", по видимому, чтобы её начали путать с достойнейшей "Открытой олимпиадой школьников по программированию".

Или олимпиада "Надежда энергетики", которую то включают в перечень, то выкидывают. Тут достаточно бегло взглянуть на задания, авторские решения, критерии проверки и работы призеров. Это тоже бланковая олимпиада, но тут сложно понять, чего же жюри хочет получить от участников? В заданиях написано, что "Для заданий 1, 2, 4, 5 требуется разработать алгоритм на языке блок-схем, псевдокоде или естественном языке". Да, именно так, не программу, а алгоритм! За разработанную программу, оказываются, снижают баллы — это в критериях написано: "Если представлена правильная реализация на языке программирования вместо разработки алгоритма, то максимальная оценка – 7 баллов". И, действительно, снижают: раз, два, три.

Откроем авторские решения, чтобы понять, что такое "алгоритм", который должен быть оценён максимальным баллом, в отличие от программы. А там написано несколько слов с описанием решения а дальше текст программы на русском алгоритмическом языке, известном как "Кумир". Это вполне себе язык программирования, у него даже есть консольный компилятор, который можно прикрутить к тестирующей системе. Но с точки зрения жюри программа на Кумире — это разработанный "алгоритм", а программа на другом языке программирования алгоритмом не является, и полный балл не получит. Те, кто рисуют блок-схемы — молодцы, они алгоритм разработали, а те, кто программу написал — нет, они алгоритм не разработали.

Благодаря требованиям к олимпиадам в части публикации заданий, критериев оценивания, работ победителей и призёров, все могут оценить достоинства той или иной олимпиады, квалификацию методической комиссии и жюри олимпиады. Но непонятно, как олимпиады "Бельчонок" и "Надежда энергетики" прошли экспертизу РСОШ. Не следует ли сделать открытыми ещё и результаты экспертизы, чтобы все желающие могли ознакомиться ещё и с мнением экспертов относительно той или иной олимпиады?

Полный текст и комментарии »

  • Проголосовать: нравится
  • +368
  • Проголосовать: не нравится

Автор dkirienko, история, 6 лет назад, По-русски

Посчитал статистику, какие языки программирования используют участники в разных регионах на региональном этапе в 2019 году.

Скачиваем и смотрим файл со статистикой

Удалось собрать сведения из 78 регионов + Сириуса. Список регионов, которые не охвачены статистикой:

  • 19 Республика Хакасия
  • 20 Чеченская Республика
  • 28 Амурская область
  • 39 Калининградская область
  • 51 Мурманская область
  • 57 Орловская область
  • 62 Рязанская область

Буду рад, если кто может достать статистику из этих регионов. Мне нужны логи тестирующей системы за первый тур в текстовом формате (csv, xml), где была бы информация о сабмитах (минимум пользователь, язык программирования, результат тестирования в баллах).

Методика подсчёта. Учитывается только первый день, анализируются логи тестирующей системы. Чтобы не считать ошибочно отправленные файлы, считаются только решения, набравшие больше 0 баллов, или (если такая информация доступна в логах) решения, набравшие 0 баллов, но прошедшие первый тест. Далее считается количество участников, которые сдали решения на данном языке программирования (учитываемые по правилам выше). Тем самым один участник может использовать несколько языков программирования, поэтому сумма долей всех языков программирования больше 100%.

Яндекс.Контест, ejudge и, возможно, некоторые другие тестирующие системы не поддерживают Visual C++, поэтому реальная доля участников, использовавших Visual C++, будет выше. Под Delphi подразумевается в том числе и Free Pascal в режиме Delphi (это в Яндекс.Контесте и, возможно, других тестирующих системах).

Также у меня есть статистика по языкам программирования на школьном, муниципальном, региональном этапах в Москве, собранная за много лет. И статистика по языкам программирования на заключительном этапе.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +98
  • Проголосовать: не нравится

Автор dkirienko, 10 лет назад, По-русски

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

Школьники, участвовавшие в олимпиаде в Екатеринбурге, могут поддержать данное обращение, направив аналогичное обращение (от себя лично или от родителей) в Министерство образования и науки. Для этого есть три способа:

1 (хороший). Почтой России, заказным письмом с уведомлением о вручении. Адрес: Россия, 125993, Москва улица Тверская, дом 11, ГСП-3, Министерство образования и науки РФ.

2 (еще лучше). Письмо пишется в двух экземплярах, отвозится в экспедицию Министерства (Москва, Брюсов переулок, дом 11, там такое крылечко со ступеньками, но вывески на внешней двери нет). Отдаете один экземпляр, на второй вам ставят штамп о приеме — вот я так делаю.

3 (удобный, но без гарантии ответа). Электронное обращение оставляется на сайте.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

Автор dkirienko, 11 лет назад, По-русски

Как всегда, мы продлили заочный этап открытой олимпиады по программированию для школьников. На этот раз его продлили до 27 января.

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

Сайт: http://olympiads.ru/zaoch/

Полный текст и комментарии »

  • Проголосовать: нравится
  • +14
  • Проголосовать: не нравится

Автор dkirienko, 12 лет назад, По-русски

Я составил обращение в Министерство образования и науки и Центральный оргкомитет всероссийской олимпиады школьников о квотах на число победителей и призеров заключительного этапа всероссийской олимпиады школьников по информатике. Подробней о проблеме я писал здесь: http://www.rosolymp.ru/index.php?option=com_agora&task=topic&id=577&Itemid=4884

Прочитать обращение и подписать можно здесь: https://mypetition.ru/petition/225

Участникам РОИ-2013, членам жюри и руководителям команд лучше подписать бумажный текст прямо сейчас в Уфе.

Заранее предупреждаю — в этом году уже ничего не изменится.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +17
  • Проголосовать: не нравится

Автор dkirienko, 12 лет назад, По-русски

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

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

Если тестирующая система не используется, то хотелось бы получить более подробные комментарии о том, как это происходит.

Обновление от 25 января: Удалось собрать информацию из 36 регионов, то есть почти из половины. Это — все сколько-нибудь сильные и заметные на олимпиадах регионы.

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

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

Есть регионы, которые сами не могут организовать процесс, но хотят. Здесь нужно либо предоставлять им "аутсорсинг", либо помогать в настройке тестирующей системы. Оба варианта, похоже, пользуются спросом — есть регионы, которые хотят поставить ejudge, но у них не получается, есть регионы, которые уже используют "аутсорсинг". Мне кажется, что оба пути нужно развивать — предоставлять конфиги для ejudge и инструкции по его установке и настройке (возможно, удаленной), распространять идею "аутсорсинга" для проведения тестирования.

К сожалению, думаю, что очень много регионов, где не могут и не хотят, это — типичная российская провинция. Далеко ехать не надо — уже соседние с Москвой области зачастую весьма депрессивные. Сидит в такой области председатель жюри из местного пединститута, которому уже давно пора на пенсию, получает зарплату в 10.000 рублей, понятно, что ему делать ничего и не хочется, и не можется. Не очень понятно, что нужно делать в такой ситуации, т.к. требовать соблюдения регламента проведения регионального этапа от такого жюри, пожалуй, бесполезно.

По-прежнему интересуют информация из регионов, не попавших в список.

Список по состоянию на 6 февраля (45 регионов):

Регион                    Тестирующая система        Кто поддерживает
Москва                    ejudge                     самостоятельно
Санкт-Петербург           PCMS-2                     самостоятельно 
Московская область        ejudge                     самостоятельно
Приморский край           imcs.dvgu.ru/cats          самостоятельно
Пермский край             acm.timus.ru               Timus team (Екатеринбург)
Челябинская область       ipc.susu.ac.ru             самостоятельно
Новосибирская область     olympic.nsu.ru             самостоятельно
Ставропольский край       contest.ncstu.ru           самостоятельно
Удмуртская республика     bacs.cs.istu.ru            самостоятельно
Самарская область         contest.uni-smr.ac.ru      самостоятельно
Ярославская область       ejudge                     gurovic (Москва)
Камчатский край           ejudge                     gurovic (Москва)
Респ. Сев.Осетия-Алания   ejudge                     gurovic (Москва)
Ленинградская область     testsys                    самостоятельно
Вологодская область       собственная                самостоятельно
Респ. Карелия             acm.petrsu.ru/site/fsystem самостоятельно
Кировская область         ejudge                     самостоятельно
Ямало-Ненецкий АО         ejudge                     О.Пестов, Г.Чистяков (Киров)
Орловская область         testsys                    самостоятельно
Респ. Татарстан           PCMS-2                     самостоятельно
Красноярский край         собственная (acmp.ru)      самостоятельно
Саратовская область       собственная (acm.sgu.ru)   самостоятельно
Оренбургская область      собственная(?)             самостоятельно
Омская область            не используется            безуспешно пытались настроить ejudge
Респ. Мордовия            не используется
Калининградская область   acmtest.ru                 самостоятельно
Респ. Коми                contester                  самостоятельно
Краснодарский край        скрипты для тестирования   хотят перейти на ejudge
Респ. Дагестан            contester и dudge          самостоятельно
Респ. Адыгея              ejudge                     самостоятельно
Респ. Башкортостан        собственная                самостоятельно
Свердловская область      собственная                самостоятельно
Томская область           ejudge                     самостоятельно
Рязанская область         не используется            проверка без чекеров на сокращенной системе тестов
Нижегородская область     собственная                самостоятельно
Тверская область          собственная                самостоятельно
Иркутская область         ejudge                     самостоятельно
Воронежская область       скрипты для тестирования
Тульская область          скрипты для тестирования   хотят перейти на тестирующую систему
Ростовская область        ejudge                     самостоятельно
Алтайский край            ejudge                     самостоятельно
Респ. Марий Эл            ejudge                     самостоятельно
Астраханская область      не используется
Брянская область          PCMS-2                     самостоятельно
Республика Алтай          скрипты для тестирования   хотят перейти на ejudge

Полный текст и комментарии »

  • Проголосовать: нравится
  • +46
  • Проголосовать: не нравится

Автор dkirienko, 12 лет назад, По-русски

В ближайшие субботу и понедельник (19 и 21 января) будет проходить региональный этап всероссийской олимпиады школьников по информатике.

После окончания второго тура олимпиады, в понедельник, 21 января, в 18:00 московского времени я проведу онлайн-видеоразбор заданий олимпиады, который может быть прежде всего интересен участникам олимпиады из всех регионов.

Разбор будет проводиться на сайте 100ege.ru. Подключиться к онлайн-разбору можно из дома или из любого места, где есть скоростной доступ в интернет. Видеозапись разбора будет доступна для просмотра начиная с 22 января.

Для посещения разбора необходимо зарегистрироваться на сайте 100ege.ru центра онлайн-обучения, и добавить в личном кабинете курс "Программирование (Продвинутый уровень)", затем в 18:00 подключиться к курсу (16-е занятие курса). Данное занятие является бесплатным.

Update: запись разбора доступна на http://www.100ege.ru/tasks/video?l=3277 без регистрации.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +39
  • Проголосовать: не нравится

Автор dkirienko, 12 лет назад, По-русски

Вероятно, кому-то это будет интересно...

Московская командная олимпиада школьников по программированию состоится 14 октября. Олимпиада является отбором на ВКОШП. Регистрация команд (и заочный отборочный этап) будут проходить до 8 октября.

Сайт олимпиады, где опубликована вся информация и открыта регистрация:

http://olympiads.ru/moscow

Полный текст и комментарии »

  • Проголосовать: нравится
  • +38
  • Проголосовать: не нравится

Автор dkirienko, 14 лет назад, По-русски

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


Итак, хронология.

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

1991-1993 год (школа, 8-9 класс) - Бейсик, в 8-м классе на Корвете, в 9-м классе уже в другой школе на БК-0010.

1993 год - вернулся из летней школы, очень воодушевленный с тягой к знаниям. Достал книжку по Паскалю, прочитал за неделю лежа на диване, пришел в школу и стал писать на Паскале. Два года (10-11 класс) писал только на Паскале.

1994 год - узнал, что есть "крутой и настоящий" язык Си. Купил толстую книжку по Си, прочитал, в принципе, мог писать на Си, но язык мне не понравился, в результате на Си я почти не писал.

1995 год - в университете на Паскале писать было нельзя... Пришлось переходить на Си и С++. Мне Си/C++ не нравился, но в итоге, как я обычно говорю, меня "заставили полюбить C++". С тех пор С++ стал на многие годы моим любимым и основным языком, впрочем, эффективно использовать STL я так и не научился (возможно потому, что тогда STL был еще не столь крутым).

Где-то после 2000 года - понял, что для каких-то задач мне нужен Perl. Освоил Perl - на неглубоком уровне, но достаточном для нужных мне задач. Perl мне тоже нравится, ну скорее как развлечение вида "О, посмотрите, какое извращение можно написать на перле".

2002 год - пришел в школу и начал выбирать язык, чтобы учить школьников. Посмотрев на разные языки понял, что Питон - наиболее подходящий для обучения язык. Года 3 работал с Питоном, потом перестал - в числе одной из причин была невозможность использования его на олимпиадах. Вместо этого начал работать над тем, чтобы Питон стал доступен на олимпиадах - вполне успешно.

В итоге на сей момент я использую довольно регулярно три языка - Питон, С++ и Perl. Правда, я не занимаюсь программированием профессионально. Я так и не освоил Java, C#, функциональные языки (хотя чужой код на Java мне приходилось править), поскольку не было причин для изучения этих языков.

Также в этот список включены только те языки, которые в моей жизни сыграли достаточно серьезную роль, при этом писал я еще на много чем - и web-сайты делал на ASP и PHP, и курсовик писал на Maple, и перебор перестановок кодил на ассемблере, но все это в итоге оказалось несерьезным .

Полный текст и комментарии »

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

Автор dkirienko, 14 лет назад, По-русски

На странице http://codeforces.net/contests сейчас написано:

Предстоящие или текущие соревнования
 
 
НазваниеНачалоДлительность  
Codeforces Beta Round #75 (Div. 1 + Div. 2)30.06.2011 19:0002:00До начала 5 днейДо регистрации 4 дня

Ну вообще-то Beta Round #75 уже состоялся 20 июня, о чем написано ниже.


Полный текст и комментарии »

  • Проголосовать: нравится
  • -18
  • Проголосовать: не нравится

Автор dkirienko, 14 лет назад, По-русски

Сегодня в отборочном раунде Google Code Jam была задача A, где требовался стандартный фокус - нужно синхронно отсортировать два списка. В данном случае у нас был список длин дорожек и скоростей перемещения по ним, нужно было отсортировать список дорожек по скорости перемещения, но при этом сохраняя их длины.


На C++ это я бы сделал так: дорожка будет храниться в виде pair <int, int>, где поле first будет равно скорости перемещения по дорожке, поле second будет равно длине дорожки, дальше заводим массив или вектор типа pair <int, int> и стандартная сортировка как раз отсортирует по возрастанию поля first.

Но поскольку писал я на Питоне, а не на C++, то нужно было сделать тот же самый трюк в Питоне. К тому же я уже начал писать решение этой задачи на Питоне, потом понял, что моя первоначальная идея была неправильной и мне как раз нужно была такая "синхронная" сортировка.  Причем желательно было написать быструю сортировку, т.е. воспользоваться стандартной сортировкой. А вот как раз такой "синхронной" сортировкой я никогда в Питоне не пользовался.

Оказалось, можно делать так (конечно, для некоторых это не откровение, но я так не делал никогда). Заведем список из номеров дорожек, т.е. просто список [0, 1, 2, ...]:
Idx = list(range(n + 1))
Также заведем два словаря (dict) V и L, которые будут по ключу (номеру дорожки) возвращать ее скорость и длину. Словари заполняются при считывании данных. А дальше - пишем так:
Idx = sorted(Idx, key = V.get)
То есть вызывается стандартная сортировка для списка Idx, но в качестве ключа передается метод get списка V, который по числу (номеру дорожки) будет возвращать скорость ее движения. В результате список номеров Idx будет отсортирован по возрастанию значения V.get(k) (где k - номер дорожки).

А при чем тут ЕГЭ по информатике? А при том, что в этом году на ЕГЭ по информатике была задача C4, где нужно было сделать что-то подобное. Один (неизвестный мне) московский школьник, написал решение на питоне с таким фокусом. Участвуя в проверке работ неделю назад, я увидел это решение, разобрался в нем и теперь смог увиденный в работе школьника прием использовать при решении задачек Code Jam.

Мораль: ЕГЭ может быть полезно не только школьникам, но и проверяющим работы :)

Полный текст и комментарии »

  • Проголосовать: нравится
  • -1
  • Проголосовать: не нравится

Автор dkirienko, история, 14 лет назад, По-русски

Обновление 6 ноября 2019 года: Добавлены данные за 2019 год. Полностью исчез Паскаль. Совсем. Ни одного сданного решения.

Обновление 22 апреля 2018 года: Добавлены данные за 2018 год. Принципиально ничего не меняется, очень сильно выросла доля участников, которые пишут и на C++, и на Python. 3/4 участников пишет только на C++, но почти 1/5 участников пишет на С++ и на Python.

Обновление 1 апреля 2017 года: Добавлены данные за 2017 год. Предсказуемо сокращается число участников, пишущих на Pascal, но неожиданно сократилось и число участников, использующих Java. Python по-прежнему остается распространенным вторым языком после C++.

Обновление 9 апреля 2016 года: Добавлены данные за 2016 год. По-прежнему, для каждого участника считается язык, который он преимущественно использовал. Число в скобках — количество людей, которые сдали хотя бы одно решение на этом языке. То есть достаточно мало участников пишет только на Python или преимущественно на Python, но много участников использовало его, как второй язык (вместе с C++).

В 2016 году Pascal окончательно перешел в число "маргинальных" языков и С++ стал единственным массовым языком программирования на РОИ. По числу участников, которые хотя бы один раз использовали этот язык программирования, Pascal уступает уже и Java, и Python. Удивительно, что число участников, использующих Java и Python уменьшилось по сравнению с прошлым годом, т.е. растет только C++.

А вот здесь статистика языков программирования на этапах всероссийской олимпиады в Москве за последние годы.

Исходное сообщение Загорелся идеей посмотреть статистику использования языков программирования на РОИ за последние годы. Вот что получилось:

 Год   Паскаль   C++   Бейсик   Java   Python   C#   Всего 
 1997  79 5 18       102
 1998  96 9,5 10,5       116
 1999  103,5 18 7,5       129
 2001  113 8 9       130
 2002  122 10 0       132
 2003  150 21 0       171
 2006  166 31 0       197
 2007  162 26 0       188
 2008  193 54 0       247
 2010  128 68 0 6     202
 2011  104 120 1       225
 2012  96 133 1 6 3 0 239
 2013  59 165,5 0 5 5,5 1 236
 2014  42,5 (46) 185,5 (188) 0 9,5 (11) 6,5 (13) 1 (1) 245
 2015  19 (20) 205 (210) 0 15 (16) 10 (24) 2 (2) 251
 2016  9 (11) 215 (218) 0 12 (12) 5 (15) 1 (1) 242
 2017  6 241 (244) 0 5 (6) 4 (26) 1 257
 2018  6 (7) 227 (233) 0 8 (12) 3 (46) 0 244
 2019  0 258 (261) 0 3 (6) 4 (14) 0 265

За 2000, 2004, 2005, 2009 года архивов РОИ с решениями всех участников на neerc нет, поэтому данных нет. Разницы между языками C и C++, Паскаль и Дельфи и т.д. нет. Если участник писал на нескольких языках программирования, то считался тот язык, на котором он сдал больше задач. Если сдал поровну задач на двух языках — то получается по 0,5 участника в статистику каждого языка.
А вот график долей языков программирования с 1997 года.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +14
  • Проголосовать: не нравится

Автор dkirienko, 14 лет назад, По-русски
На форуме одного весьма далекого от спортивного программирования сайта увидел замечание: "Известно, что 90% участников всероссийской олимпиады по информатике пишут на Pascal, а среди её победителей их доля равна 95%".

Чтобы аргументировано опровергнуть, посчитал статистику использования языков программирования на РОИ-2011. Думаю, что результат может кого-то заинтересовать.

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

Всего участников было 225. 218 участников использовали только один язык программирования. 7 участников использовало Паскаль и C++ одновременно (их я посчитал по тому языку, который они использовали для решения большего числа задач).

Вот результат:

C++: 120 (53%)
Паскаль: 104 (46%)
Visual Basic: 1 (меньше 0.5%)

Теперь данные только по победителям олимпиады (16 человек):
C++: 13 (81%)
Паскаль: 3 (19%)

Теперь данные только по призерам олимпиады, которые не стали победителями (85 человек):
C++: 52 (61%)
Паскаль: 33 (39%)

Напомню, что в будущем году обещают большие изменения относительно языков программирования на РОИ.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +36
  • Проголосовать: не нравится

Автор dkirienko, 14 лет назад, По-русски

Российский совет олимпиад школьников утвердил уровни "олимпиад союза ректоров", на основании которых могут выдаваться льготы одиннадцатиклассникам при поступлении в вузы (не считая заключительного этапа всероссийской олимпиады школьников, которая проходит отдельно).


Министерство образования издало проект приказа: http://mon.gov.ru/files/materials/8455/11.05.03-olymp.pdf

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

Итак, фанфары!

Олимпиада первого уровня

Открытая олимпиада школьников «Информационные технологии» (п. 55) http://olymp.ifmo.ru/

Олимпиады второго уровня

Московская олимпиада школьников (п. 30) http://www.olympiads.ru/moscow/
Олимпиада школьников по информатике и программированию (п. 48) - ИОИП http://neerc.ifmo.ru/school/ioip/
Открытая олимпиада школьников по программированию (п. 56) - "заочка" http://olympiads.ru/zaoch/

Олимпиады третьего уровня

Всесибирская открытая олимпиада школьников (п. 10)
Олимпиада школьников «Ломоносов» (п. 42)
Олимпиада школьников «Шаг в будущее» (п. 47).
Открытая межвузовская олимпиада школьников Сибирского Федерального округа «Будущее Сибири» (п. 54)

Вы впервые слышите об Открытой олимпиады школьников "Информационные технологии"? Да вы что, это очень известная олимпиада, в этом году победителями этой олимпиады объявлено 64 одиннадцатиклассника и еще 220 одиннадцатиклассников стали призерами! А теперь зайдите на сайт http://olymp.ifmo.ru/ и посмотрите на задачи олимпиады....

Полный текст и комментарии »

  • Проголосовать: нравится
  • +14
  • Проголосовать: не нравится