评测模板管理
评测模板分成 IO
、SPJ
、Advanced
三种类型。
IO
:适用于输入输出型题目的评测
SPJ
:适用于 Special Judge 型题目的评测,即一道题目可能有多解,需要一个单独的程序来对答案判正确性
Advanced
:适用于进阶模式型题目的评测。是更强大的评测能力,让出题方来定义如何评测一份代码/一些文件
本章中将会描述一下,评测模板的业务,以及如何制作、测试、添加评测模板。
评测模板列表
操作栏右边有 Edit
和 Fork
。
IO 类型
IO 即 input/output
,即通过标准输入输出,将测试数据作为标准输入流输入到用户程序,用户程序的标准输出流的输出和标准答案进行比对,根据用户程序运行时状态和运行后结果,来评价用户程序的正确性和性能。
SDUOJ 中,添加一个 IO 类型的评测模板,意味着多增加一种 "评测语言" 的配置。
下图是评测 C++11 程序的评测模板配置:
其中,Script 约定为一个 JSON 串。格式及其解释:
{
"user":{ // user 即定义对用户程序的操作
"compile":{ // 编译操作和配置
"srcName": "代码存到哪个文件名", // NotNull
"maxCpuTime": 1000, // 最大CPU执行时间,NotNull
"maxRealTime": 2000, // 最大真实执行时间=CPU执行时间+IO执行时间,不定义时取 maxCpuTime
"maxMemory": 262144, // 最大内存
"commands": [ // 大于0条的 shell 命令
"..."
]
},
"run":{ // 运行操作和配置
"command": "...", // 要运行的 shell 命令, NotNull
"seccompRule": "general", // 安全沙箱规则
"maxCpuTimeFactor": 1, // 最大CPU执行时间倍率,评测时限制值=题目设置的时间限制*倍率,不定义时取1
"maxRealTimeFactor": 1, // 最大真实执行时间倍率,评测时限制值=题目设置的时间限制*倍率,不定义时取1
"maxMemoryFactor": 1, // 最大内存倍率,评测时限制值=题目设置的内存限制*倍率,不定义时取1
"envs": [ // 环境变量,可不定义
"..."
]
}
}
}
- C++11 的评测模板样例如下:
{
"user":{
"compile":{
"srcName":"solution.cc",
"maxCpuTime":3000,
"maxRealTime":5000,
"maxMemory":262144,
"commands":[
"/usr/bin/g++ -DONLINE_JUDGE -O2 -w -fmax-errors=3 -std=c++11 solution.cc -lm -o solution"
]
},
"run":{
"command":"solution",
"seccompRules":"c_cpp"
}
}
}
- Python3 的评测模板样例如下:
{
"user":{
"compile":{
"srcName":"solution.py",
"maxCpuTime":3000,
"maxRealTime":5000,
"maxMemory":262144,
"commands":[
"/usr/bin/python3 -m py_compile solution.py"
]
},
"run":{
"command":"/usr/bin/python3 __pycache__/solution.cpython-36.pyc",
"seccompRules":"general",
"maxRealTimeFactor":2,
"maxCpuTimeFactor":2
}
}
}
- Python2 的评测模板样例如下:
{
"user":{
"compile":{
"srcName":"solution.py",
"maxCpuTime":3000,
"maxRealTime":5000,
"maxMemory":262144,
"commands":[
"/usr/bin/python -m py_compile solution.py"
]
},
"run":{
"command":"/usr/bin/python solution.pyc",
"seccompRules":"general",
"maxRealTimeFactor":2,
"maxCpuTimeFactor":2
}
}
}
- Java8 的评测模板样例如下:
{
"user":{
"compile":{
"srcName":"Main.java",
"maxCpuTime":3000,
"maxRealTime":5000,
"maxMemory":0,
"commands":[
"/usr/bin/javac Main.java -encoding UTF8"
]
},
"run":{
"command":"/usr/bin/java -XX:MaxRAM={problemMemoryLimit}k -Djava.security.manager -Djava.awt.headless=true Main",
"seccompRules":"general",
"maxMemoryFactor":0,
"maxCpuTimeFactor":2,
"maxRealTimeFactor":2
}
}
}
SPJ 类型
spj 即 Special Judge,对于一些有多解的题目,需要一个单独的程序来对答案判正确性。
{
"user":{ // user 即定义对用户程序的操作
// 与 IO 类型评测模板内定义是相同的
},
"spj":{ // spj 即定义对 spj 程序的操作
"compile":{ // 编译操作和配置
"srcName": "代码存到哪个文件名", // NotNull
"maxCpuTime": 1000, // 最大CPU执行时间,NotNull
"maxRealTime": 2000, // 最大真实执行时间=CPU执行时间+IO执行时间,不定义时取 maxCpuTime
"maxMemory": 262144, // 最大内存
"commands": [ // 大于0条的 shell 命令
"..."
]
},
"run":{ // 运行操作和配置
"command": "...", // 要运行的 shell 命令, NotNull
"seccompRule": "general", // 安全沙箱规则
"maxCpuTimeFactor": 1, // 最大CPU执行时间倍率,评测时限制值=题目设置的时间限制*倍率,不定义时取1
"maxRealTimeFactor": 1, // 最大真实执行时间倍率,评测时限制值=题目设置的时间限制*倍率,不定义时取1
"maxMemoryFactor": 1, // 最大内存倍率,评测时限制值=题目设置的内存限制*倍率,不定义时取1
"envs": [ // 环境变量,可不定义
"..."
]
}
}
}
待写
Advanced 类型
待写