数据格式规范

By cong258258,Anoxiacxy,Alan-Liang,LauYeeYu,更新于 2024.10.11。

ZIP总格式

注:请尽量使用避免任何未在此处出现的特性或问题(特别是做出某个特定文件名的文件存在的假设),因为这可能在评测后端升级后发生变化。

C++ 评测

如果编译时需要包含任何题目提供的头文件(不包含选手提交的代码),需要将文件名填入 config.jsonSupportedFiles,参见 SupportedFiles 部分

Verilog 评测

若干 数字.v,他们将引用学生上传的 .v 模块(评测时保存在 answer.v)进行评测。文件名请采用连续编号的,从 1 开始的纯数字。你需要 `include “answer.v”

description.md

solution.cpp

1.in

1.ans / 1.out

config.json

如果您使用 VS Code,您可以在 config.json 中加入一行:

{
  "$schema": "https://acm.sjtu.edu.cn/OnlineJudge/static/assets/problem-config.schema.json",
  ...
}

以获得更好的代码补全体验。

Groups

Details

CompileTimeLimit

建议值 10000(10秒),单位 ms,如需从 Git 拉取编译评测可适当增加。

SPJ

评测分为三个步骤,每个步骤都可以进行一定程度上的自定义。对于传统题目,可以省略此项。

编译(Compile)

将选手提交的程序编译为可执行文件。支持以下三种类型:

默认为 classic。

运行(Run)

运行选手提交的程序。对于 I/O 交互题,同时运行交互器。支持以下四种类型:

默认为 classic。

检查(Check)

运行检查器,给出评测结果。支持以下三种类型:

默认为 compare,IgnoreInsignificantWhitespace 为 true。

config.json 格式

在 config.json 中,可以指定这三个步骤的类型。例如:

  "SPJ": {
    "Compile": "classic",
    "Run": "classic",
    "Check": "custom"
  }

默认值可以省略:

  "SPJ": {
    "Check": "custom"
  }

如果该类型有需要填写的参数,则需要这样写出:

  "SPJ": {
    "Check": {
      "Type": "compare",
      "IgnoreInsignificantWhitespace": false
    }
  }

几种常用的 SPJ 类型可以直接写为数字:

SupportedFiles

一个数组,包含运行时需要额外引用的非库的头文件。注意,这里引入的文件需要被放入数据包的根目录下,而且该文件只会在文件的编译期被使用,程序运行时是不可以使用到这里的文件的。例:

  "SupportedFiles": [
    "utility.hpp",
    "exceptions.hpp",
    "class-bint.hpp",
    "class-integer.hpp",
    "class-matrix.hpp"
  ]

请不要将 main.cpp 以及 src.hpp 写在 supportedFiles 中!

Verilog

是否启用 Verilog 评测,启用为 true,否则为 false 。默认为 false。请注意,如果启用该选项,所有的提交的将会强制被视作 Verilog。关于 Verilog 评测的更多信息,请参阅 Verilog 评测章节

Quiz

是否是填选题,填选题为 true,否则为 false。默认为 false

I/O 交互题

评测 I/O 交互题时,将在一个评测机上同时运行选手提交的程序和题目提供的交互器(interactor),两者位于不同的沙箱中,仅可通过标准输入输出通信。选手的标准输出会接到交互器的标准输入,反之亦然。题目数据中的输入文件会从命令行传给交互器:

./interactor input output
FILE *input   = fopen(argv[1], "r"); // 题目的输入文件
FILE *output  = fopen(argv[2], "w"); // 输出到此文件中

其中:

注意:为了使得评测能够进行下去,选手程序和裁判程序应当在输出每一行后主动 flush 输出流:例如 fflush(stdout) 或者使用 std::cout << std::endl 换行。否则,可能会导致交互死锁造成 TLE。

Interactor 可以为可执行文件或 C++ 源代码,可以在 config.json 中指定 interactor 的位置:

  "SPJ": {
    "Run": {
      "Type": "interactive",
      "Interactor": {
        // 表示 interactor 为可执行文件,位于 zip 文件的 题号/interactor 路径下
        "Type": "binary",
        "Path": "interactor"
      }
    }
  }
  "SPJ": {
    "Run": {
      "Type": "interactive",
      "Interactor": {
        // 表示 interactor  C++ 源码,位于 zip 文件的 题号/interactor.cpp 路径下
        "Type": "cpp",
        "Path": "interactor.cpp"
      }
    }
  }

如果不指定类型和位置,OJ 将使用 interactor (可执行文件)和 interactor.cpp (C++ 源码)作为 interactor 位置。

注意:为保证数据包的兼容性,interactor 可执行文件应当是文本文件(使用 #! 的 shell/python 等脚本),不建议是二进制文件。

对于 I/O 交互题,经常直接让 interactor 输出评测结果,而不使用另外的 checker。此时需要将 check 步骤指定为 skip:

  "SPJ": {
    "Run": "interactive",
    "Check": "skip"
  }

在调试时,可以使用交互题测试工具进行测试。这个工具可以同时启动两个通过 I/O 进行交互的程序,同时可以输出两个程序之间的交互(需要 -v 选项)。这个工具也可以稍作改动后下发给学生。

交互题测试工具

testlib

Interactor 可以使用 testlib.h 编写,具体参见 testlib.h 文档。OJ 的编译环境中自带 testlib.h,无需在数据包中包含。本地调试时,请使用 ACMOJ 专用的 testlib.h,不要使用 Codeforces/DOMjudge 等版本。

注意:默认情况下,testlib 会认为不使用另外的 checker,需要在 config.json 中指定 SPJ.Check = skip。如果需要使用 compare 或者自定义 checker,需要在调用 registerInteraction 时传入第三个参数为 false:

registerInteraction(argc, argv, false);

以禁止 testlib 向输出文件写入评测结果。此时请使用 _ok 退出,评测结果将被忽略,以 checker 输出的评测结果为准。如需给出评测信息,请写入到输出文件中,并使用自定义 checker。

Interactor 不支持传入答案文件(ans),请将需要传入的信息全部写入到输入文件中,或使用自定义 checker。

自定义 Checker

checker 会通过命令行(argv)传递参数,格式如下。

./checker input output answer score message
FILE *input   = fopen(argv[1], "r"); // 题目的输入文件
FILE *output  = fopen(argv[2], "r"); // 用户输出
FILE *answer  = fopen(argv[3], "r"); // 题目的答案
FILE *score   = fopen(argv[4], "w"); // 把评测的分数输出到这里
FILE *message = fopen(argv[5], "w"); // 这里输出错误/提示信息

其中:

Checker 可以为可执行文件或 C++ 源代码,可以在 config.json 中指定 checker 的位置:

  "SPJ": {
    "Check": {
      "Type": "custom",
      "Checker": {
        // 表示 checker 为可执行文件,位于 zip 文件的 题号/checker 路径下
        "Type": "binary",
        "Path": "checker"
      }
    }
  }
  "SPJ": {
    "Check": {
      "Type": "custom",
      "Checker": {
        // 表示 checker  C++ 源码,位于 zip 文件的 题号/checker.cpp 路径下
        "Type": "cpp",
        "Path": "checker.cpp"
      }
    }
  }

如果不指定类型和位置,OJ 将使用 spj_binspj.cpp 作为 checker 位置。

注意:为保证数据包的兼容性,checker 可执行文件应当是文本文件(使用 #! 的 shell/python 等脚本),不建议是二进制文件。

testlib

Checker 可以使用 testlib.h 编写,具体参见 testlib.h 文档。OJ 的编译环境中自带 testlib.h,无需在数据包中包含。本地调试时,请使用 ACMOJ 专用的 testlib.h,不要使用 Codeforces/DOMjudge 等版本。

OJ 仅支持 _ok 和 _wa 两种评测结果,_pe 和 _fail 会认为是 _wa。如果需要给出部分分,请使用 quitp,不支持 _pc。