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

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

Я скачивал с помощью Codeforces API все блогпосты и комментарии к ним и сохранял их в папку. В какой-то момент я обратил внимание на то, что много блогов подряд отсутствует.

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

13155 - [30047, 43201]
5884 - [24162, 30045]
503 - [23647, 24149]
53 - [8085, 8137]
30 - [6958, 6987]
29 - [10974, 11002]
28 - [11699, 11726]
28 - [10914, 10941]
25 - [9949, 9973]
24 - [23017, 23040]
24 - [11120, 11143]
24 - [7398, 7421]
24 - [7138, 7161]
23 - [11591, 11613]
23 - [9634, 9656]
21 - [20445, 20465]
21 - [9795, 9815]
20 - [11017, 11036]
20 - [10885, 10904]
И дальше неинтересно

Видно, что первые три промежутка расположены рядом. Их суммарный пустой объем — 19542 фальшивых блогов! Но визуально кажется, что у Codeforces блогов, один из последних блогов имеет номер 45578. Но реально их количество около 18000 — именно столько можно скачать с помощью API! Вижу — ширится растёт маркетинг...

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

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

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

Java Algorithms

Многие знают отличную библиотеку алгоритмов на Java от indy256https://github.com/indy256/codelibrary/tree/master/java/src. На данный момент там 192 файлов алгоритмов (некоторые файлы являются вариациями одного и того же алгоритма). Она мне очень помогает во всех случаях жизни. Для других языков я не нашел такой обширной библиотеки.

Я экспортировал эту библиотеку в приложение для Android. С его помощью можно быстро смотреть алгоритмы. Также в настройках можно выбрать один из 73 стилей подсветки синтаксиса, 9 шрифтов и стиль приложения — Default, White, Black. Изменять размер текста кода можно двумя пальцами и дабл-тапом по экрану. Также там есть кастомный поиск, ищущий алгоритм по подстроке, и описания алгоритмов.

Google Play. Скриншоты. Еще больше скриншотов в ссылке на Google Play.

Автор библиотеки алгоритмов indy256 одобрил приложение. Думаю, что и вам оно понравится :)

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

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

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

Я создал статистику языков, используемых в решениях на Codeforces. Статистика есть за годы с 2010 по 2015, и по языкам программирования в процентах.

Codeforces API

Для парсинга использовал Java и библиотеку org.json для удобного хранения файла формата JSON. Считывается весь текст с запроса contest.status, потом оттуда каждый Submission обрабатывается отдельно

Что именно учитывается

Учитывались посылки ТОЛЬКО с соревнования (participantType = CONTESTANT и OUT_OF_COMPETITION), и ТОЛЬКО те, которые полностью прошли все тесты (verdict = OK). Участники могли бы сознательно использовать непопулярные языки программирования в дорешивании, или сделать десять неудачных посылок, а это не отражает реальное использование языка в контестах.

Объединение языков

Последний контест на время написания блога — Codeforces Round 321 (Div. 2), является самым массовым за весь 2015 год. Его начальная статистика в текстовом виде представлена здесь — http://ideone.com/X4GYBi. Первые три строчки по популярности занимают GNU C++, GNU C++11, MS C++. Несмотря на то, что компиляторы и версии языков различаются, фактически используется один и тот же язык. Поэтому я объединил различные спецификации одних и тех же языков в один язык. Некоторые из них уже не существуют на Codeforces, такие как GNU C++0x или Java 6.
Результаты Surprise Language Round не учитываются. В конце концов, через эти языки нельзя было бы решить "нормальную" задачу :)
Использовались свободные онлайн-сервисы для создания графиков
Все графики сделаны в двух видах — с C++ и без него.

Статистика по годам

2015 год (контесты 501 — 580)

Текстовый вариант.

2014 год (контесты 380 — 500)

Текстовый вариант.

2013 год (контесты 261 — 379)

Текстовый вариант.

2012 год (контесты 140 — 260)

Текстовый вариант.

2011 год (контесты 52 — 139)

Текстовый вариант.

2010 год (контесты 1 — 51)

Текстовый вариант.

Языки из Surprise Language Round-ов за все время работы Codeforces — Picat, Ada, FALSE, Mysterious Language (на самом деле Fortran), Roco, Factor, Secret_171 (на самом деле COBOL), Befunge, Pike, Tcl, Io.

Статистика по языкам

Общий график изменения популярности языков

Итоги

Многие языки являются слишком непопулярными в промышленном программировании, чтобы находить поклонников, которые не променяют их на более удобные для спортивного программирования — их доля равняется одной десятой или даже одной сотой процента от всего количества посылок. Также, по моему мнению, многие языки настолько неудобные для спортивного программирования, что решать контесты на Codeforces в них не имеет никакого смысла.
За 5-6 лет произошли изменения в популярности языков. C++ наращивает долю пользователей. Delphi потерял в популярности в 20(!) раз. Доля FPC и C# упала в 4 и в 3 раза соответственно.

Исходники парсера

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

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

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

Несколько раз встречал задачи, которые можно было бы решить, если найти, какому из n отрезков на прямой принадлежит точка с координатой x, за время log(n)

1. Отрезки могут пересекаться
2. Есть некоторые условия — нужно взять отрезок с наименьшей длиной либо с наименьшим номером в списке либо с наименьшим левым концом

Как решать эту задачу с этими условиями? Спасибо

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

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

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

Пытаюсь впихнуть невпихуемое задачу на битмаски, где можно брать либо 1 либо 2 предмета, с TL до 4000ms
Пока смотрю, сколько времени будет работать максимальный тест. Вот тут код:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int p = 24;     // Кол-во предметов максимум
    int al = (1 << p);      // Кол-во масок, "1" - предмет под i-тым битом уже взят
    int vec[1 << 24];    // Ответы к подзадачам
    int vec2[1 << 24];
    int inf = 1000000005;
    fill(vec, vec + al, inf);
    vector<int> kek;
    vec[0] = 0;
    for(int z = 1; z < al; z++) {
        // Вместо перебора 24 * (24 - 1) / 2 значений перебираем
        // места, где есть биты
        kek.clear();
        for(int ss = 0; ss < 24; ss++)
            if(z & (1 << ss))
                kek.push_back(ss);

        // Оптимальный ответ
        int last = inf;

        for(int a = 0; a < kek.size(); a++) {
            int az = z - (1 << kek[a]);
            if(last > vec[az] + 1)
                last = vec[az] + 1;
            for(int b = a + 1; b < kek.size(); b++) {
                int bz = az - (1 << kek[b]);
                if(last > vec[bz] + 2)
                    last = vec[bz] + 2;
            }
        }

        //vec[z] = last;
    }
}

Предполагается, что в переменной last сохраняется оптимальный ответ (конечно, не просто vec[xx]+2, а по нужной формуле расстояний между предметами kek[a] и kek[b])
Запуск codeforces этого кода в GNU C++ работает за 1309ms (погрешность +-15ms)
Если раскомментировать строку "vec[z] = last;" это работает за 4040ms
Наконец, если завести новый массив vec2 и заменить строку на "vec2[z] = last;", это работает практически за то же время что в первый раз — от 1294ms до 1310ms

Вот это прикол! Какое его научное обоснование?

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

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