Skip to content

Конвертер задачи из полигона #66

@DIvanCode

Description

@DIvanCode

polygon - известная платформа для создания задач. Она позволяет скачивать пакет, в котором содержатся все данные об определённой задаче.

Taski - сервис в CoDuels, являющийся API доступа к задаче для просмотра и тестирования. В нём задачи хранятся в другом формате. Нужно написать конвертер пакета polygon в наш внутренний формат хранения.

Пакет polygon представляет собой архив (пример: https://disk.yandex.ru/d/0bjmCY95u6Sqfw).

Файл problem.xml содержит всю метаинформацию о задаче. Оттуда по сути нас интересует:

  1. Название задачи (Минимум на отрезке)
  2. Ограничение по времени (500)
  3. Ограничение по памяти (268435456)
  4. Количество тестов (17)
  5. Открытые тесты (показывающиеся в условии) обозначены флагом sample=true
  6. Файл с правильным решением (solutions/20786723.cpp)
  7. Файл с чекером (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++"
    }
}
  1. id представляет собой hex строку из 20 байт (40 символов {0-9,a-f}) - выбирать рандомно
  2. type всегда write_code
  3. level принимать в качестве параметра при вызове конвертера (число от 1 до 10)
  4. тесты с 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

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions