Рецепт Панацеи или Как Построить Олимпиадный Коммунизм.

Revision ru5, by ruslanjan, 2019-12-10 10:50:00

Tекущие языки по типу C++, Java или Python создавались не для олимпиад и уж точно не для точной оценки решения системой. Помимо того что эти языки разные (скорость, наличие или отсутствие управление памяти) они еще и несут за собой багаж функции которые вовсе не нужны для олимпиад, к примеру импортирование библиотек (C++, Python, Java), пакеты (Java с ее package) и т.п.

В чем же проблема?

Не так просто придумать задачу в которой ни один язык не будет иметь преимущества (Обычно на это забивают взяв C++ за основу). Сделаете задачу на длинку тогда Python и Java будет иметь преимущество а участники с плюсами будут лишние минуты тратить на реализацию или дали задачу которая требует аккуратно реализации привет java. И таких примеров много, можно сказать что каждый язык это инструмент и нужно подбирать для задачи нужный но будем реалистичнее многие машинально выучили свои шаблоны для алгоритмов и оптимизации (например cin.tie(NULL) в C++ или реализация своего ридера в java) и они не могут быть перемещены между языками уж слишком они различны.

Это не только проблема участников

Помимо жури также страдают и создатели систем тестирование. Запуск чужого кода на языке не рассчитанного на запуск в песочнице как javascript создает проблемы с безопасностью в тестирующих системах и не легкой задачей подсчета памяти и времени. Об уязвимостях можно писать отдельную статью, так что вот неполный список с чем надо бороться: Бесконечна компиляция (в C++, да есть такой баг), Создание потоков, Создание подпроцессов, Выход в интернет, Доступ к файлам, Превышение Памяти. Каждый из них может уронить воркер, систему или даже получить решение. Это крайне сложная задача

Эти языки не пригодятся

Вы будите правы сказав что эти языки применяют однако как их используют в соревновательном программирование ни как не подходит для проектов, например в C++ никто не заботится о освобождению памяти. В итоге придется учить язык как будто сначала. Изучается только то что необходимо для олимпиад (но все равно это даст буст в программирование).

Все прогают на C++ какая разница?

Если вы пишите на C++ тогда сразу читайте "Рецепт панацеи". Для вас будет не разница а больше возможностей :)

Рецепт панацеи

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

Основная идея

// Вообще STRONG_TYPING включен по умолчанию
#enable STRONG_TYPING
#define ll int

int bp(int a, int b) {
    if (!b)
        return 1;
    if (b&1)
        return a;
    int x = bp(a, b/2);
    return x*x;
}

int p, q;
scanf("%d %d", &p, &q);
printf("%d", bp(p, q));

Кажется знакомым? Синтаксис будет взят у C++ и Java (Питонщики не расстраивайтесь :3 ). Ключевой идей будет #enable этот препроцессор будет задавать какой режим или функция будут использоваться программой к примеру будет ли она строго типизированная или динамическая. По сути собирая набор #enable вы получаете свой язык для решения конкретной задачи.

Список режимов и доступных(Будет дорабатываться):

  • #enable FUCNTIONAL_PROGRAMMING — Функции становятся не мутабельны т.е. нельзя изменить передаваемую переменную. Некоторые встроеные функции становятся не доступными (их заменяют другие) Когда нужно писать аккуратно.
  • #enable DYNAMIC_TYPING — нельзя влючать одновременно с STRONG_TYPING.
  • #enable STRONG_TYPING — включен по умолчанию.
  • #enable NO_TYPE_CONVERSION — не будет приведение типов — 1.0 + int(2) -> error. Когда нужно писать очень аккуратно
  • #define так же доступен

Пример с динамической типизацией:

#enable DYNAMIC_TYPING

// в DYNAMIC_TYPING можно указать тип если вы к примеру перешли с из STRONG_TYPING в DYNAMIC_TYPING
def bp(a, int b) { // def нужен что бы указать что это функция но (int bp()) тоже правильно
    if (!b)
        return 1;
    if (b&1)
        return a;
    let x = bp(a, b/2); // let - объявление переменной
    return x*x;
}

let p, q;
p = int(readItem()) // Функция считывает до пробела или переноса и возвращает `String`
q = int(readItem())
print(bp(p, q));

Как оценивать? Он же будет медленным

Да возможно будет но мы больше не будет оценивать время, теперь мы будем оценивать количество инструкций т.к. наш язык будет работать на виртуальной машине. А об этом подробнее в Структуре языка

Структура языка Кратко

  • Нету компиляции только проверка типов
  • объекты и примитивы
  • возможность создавать свои структуры через struct Type {}
  • встроеные api функции для io
  • встроенная библиотека std с реализованными алгоритмами как в c++ написанная на этом же языке
  • Управление памятью как C++. Режимы и дополнительные функции например динамической типизации доступные через препроцессор #enable THING
  • Имеет все возможности C++, Java, Python используемые в соревнованиях.
  • Возможность писать богатые чекеры, интеракторы а также дополнительные функции для конкретной задачи
  • У каждой операцией над примитивами будет свой вес а их сумма количество инструкций. например int + int имеет вес 1 а int/int имеет вес 2.

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

  • На много безопаснее для системы чем C++. можно сказать что полностью но багов никто не отменял
  • Система будет намного быстрее без проверок безопасности и компиляции.
  • Возможность соревноваться по количеству инструкций а так же ставить балы по ним. Как в игре "TIS-100"
  • Возможность писать богатые чекеры, интеракторы а также дополнительные функции для конкретной задачи. Это сделает задачи более интересными и даст больше свободы авторам задач
  • Использовать лучшее от всех языков.
  • Сразу понятен тем кто пишет на java или c++.
  • С++ код будет почти валидным.
  • Решения не будет страдать от Wall Time Limit
  • В количество инструкций будет входить только ваше решение, IO не будет учитываться как многие другие вещи вне вашем контроле в других языках.

Итог

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

P.S. Это черновик нового языка. Идеи предложения принимаются.

P.S.S. Если это будет интересной идеи то разработаю более подробный план и приступлю к реализации.

Tags c++, java, языки программирования, проверяющая система

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en2 English ruslanjan 2019-12-10 11:31:38 57
en1 English ruslanjan 2019-12-10 11:27:48 6499 Initial revision for English translation (saved to drafts)
ru5 Russian ruslanjan 2019-12-10 10:50:00 2 Мелкая правка: 'имаются.\nP.S.S. Е' -> 'имаются.\n\nP.S.S. Е'
ru4 Russian ruslanjan 2019-12-10 10:13:43 1 Мелкая правка: ' использую в соревно' -> ' используют в соревно'
ru3 Russian ruslanjan 2019-12-10 07:55:01 149
ru2 Russian ruslanjan 2019-12-10 06:14:04 3 Мелкая правка: 'лимпиад и не уж точно ' -> 'лимпиад и уж точно '
ru1 Russian ruslanjan 2019-12-10 06:13:39 6266 Первая редакция (опубликовано)