-
Notifications
You must be signed in to change notification settings - Fork 3
Description
polygon - известная платформа для создания задач. Она позволяет скачивать пакет, в котором содержатся все данные об определённой задаче.
Taski - сервис в CoDuels, являющийся API доступа к задаче для просмотра и тестирования. В нём задачи хранятся в другом формате. Нужно написать конвертер пакета polygon в наш внутренний формат хранения.
Пакет polygon представляет собой архив (пример: https://disk.yandex.ru/d/0bjmCY95u6Sqfw).
Файл problem.xml содержит всю метаинформацию о задаче. Оттуда по сути нас интересует:
- Название задачи (Минимум на отрезке)
- Ограничение по времени (500)
- Ограничение по памяти (268435456)
- Количество тестов (17)
- Открытые тесты (показывающиеся в условии) обозначены флагом sample=true
- Файл с правильным решением (solutions/20786723.cpp)
- Файл с чекером (files/check.cpp)
Папка tests содержит входные и выходные данные для всех тестов (возможно, там будут только входные данные, а выходные данные нужно будет сгенерировать с помощью запуска правильного решения).
Чекер чаще всего использует testlib.h, лежащий с ним в одной папке. При переносе в нашу систему нужно будет явно вставить код из testlib.h в начало кода чекера (самостоятельно выполнить include).
Чаще всего для конвертации условия задачи нужно посмотреть файл statements/russian/problem.tex. Там содержится легенда, формат входных и выходных данных.
Внутренний формат хранения задачи проще, чем в polygon. Вместо problem.xml есть task.json, который выглядит следующим образом:
{
"id": "7d971f50363cf0aebbd87d971f50363cf0aebbd8",
"title": "A + B",
"type": "write_code",
"level": 1,
"statement": "statement.md",
"tl": 1000,
"ml": 256,
"tests": [
{
"id": 1,
"input": "tests/01.in",
"output": "tests/01.out",
"visible": true
},
{
"id": 2,
"input": "tests/02.in",
"output": "tests/02.out",
"visible": false
}
],
"checker": {
"path": "checker.cpp",
"lang": "C++"
},
"solution": {
"path": "solution.cpp",
"lang": "C++"
}
}
- id представляет собой hex строку из 20 байт (40 символов {0-9,a-f}) - выбирать рандомно
- type всегда write_code
- level принимать в качестве параметра при вызове конвертера (число от 1 до 10)
- тесты с sample=true помечать visible=true, остальные visible=false
Пакет с задачей внутри Taski хранится в file_storage (пример, https://github.com/DIvanCode/CoDuels-Backend/blob/master/Taski/file_storage/storage/7d/7d971f50363cf0aebbd87d971f50363cf0aebbd8/task.json). Обрати внимание, что сначала идёт папка storage, потом папка 7d, а уже потом 7d971f50363cf0aebbd87d971f50363cf0aebbd8.
Также в папке 7d971f50363cf0aebbd87d971f50363cf0aebbd8 есть файл 7d971f50363cf0aebbd87d971f50363cf0aebbd8.meta.json:
{
"bucket_id": "7d971f50363cf0aebbd87d971f50363cf0aebbd8",
"trash_time": "2026-05-16T08:28:06.801064-04:00"
}
Его заполнить по аналогии, указав верный bucket_id.
p.s. При конвертации лучше явно проставить во все файлы входных и выходных данных перенос строки, так как иначе при тестировании контейнер с решением залипнет.
Metadata
Metadata
Assignees
Labels
Projects
Status