Задачи с открытыми тестами — тип задач в олимпиадном программировании, где тесты к задаче доступны для скачивания, а на проверку нужно сдать не код, а ответы на тесты. Обычно это NP-полные задачи с частичной оценкой за тест. Этот бот даёт простой способ проводить тренировочные соревнования по открытым тестам.
Создайте Telegram бота через @BotFather и получите API токен (следуйте этой инструкции).
Скачайте последнюю версию бота в Releases. Если у вас ещё не установлена JRE, скачайте и установите её по ссылке. Создайте в одной папке с ботом файл с именем config.toml
и следующим содержанием:
[bot]
username = ""
token = ""
[problem]
num_tests = 10
checker_command = []
statement_url = ""
tests_archive_url = ""
Вся настройка бота происходит в этом файле. Заполните параметры в соответствии с вашим ботом и задачей. Вот описание всех опций с примерами:
Опция | Описание | Пример |
---|---|---|
username |
Имя пользователя бота, которое вы выбрали при его создании в @BotFather | "opentests_bot" |
token |
API токен бота, который вы получили от @BotFather | "4839574812:AAFD39kkdpWt3ywyRZergyOLMaJhac60qc" |
num_tests |
Количество тестов в задаче | 10 |
checker_command |
Шаблон команды для запуска чекера (см. ниже) | ["./checker", "%test%", "%output%"] |
statement_url |
Ссылка на условие задачи, отображается при запуске и в команде /help | "https://example.com/statement.pdf" |
tests_archive_url |
Ссылка на архив с тестами, отображается при запуске и в команде /help | "https://example.com/tests.zip" |
Чекер должен принимать на вход номер теста и путь к выходному файлу, который нужно проверить. Он должен вывести в stdout две строки: в первой строке — вердикт (OK, WA, PE), а во второй — баллы за тест.
Опция checker_command
должна содержать шаблон команды для запуска чекера — список строк, содержащий исполняемый файл чекера и его аргументы. При запуске команды подстрока %test%
будет заменяться на номер теста (в 1-индексации), а подстрока %output%
- на путь к выходному файлу.
Например, можно передавать чекеру номер теста в первом аргументе и путь к выходному файлу во втором. Тогда команда для запуска чекера может выглядеть так:
checker_command = ["checker.exe", "%test%", "%output%"] # Windows
checker_command = ["./checker", "%test%", "%output%"] # Linux
Сам чекер будет считывать параметры следующим образом:
#include <iostream>
#include <string>
int main(int argc, char** argv) {
int test_number = std::stoi(argv[1]);
std::string output_path = argv[2];
// Проверить решение
std::cout << "OK" << std::endl << 0 << std::endl;
}