183 lines
5.2 KiB
Python
183 lines
5.2 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
BitOJ 自定义验证程序集成示例
|
|
演示如何在实际的BitOJ系统中使用自定义验证程序
|
|
"""
|
|
|
|
import sys
|
|
sys.path.append('../python')
|
|
|
|
try:
|
|
from judgescript import InternalJudge
|
|
except ImportError:
|
|
# 如果无法导入,创建一个模拟的类
|
|
class InternalJudge:
|
|
def __init__(self, allowpe=False):
|
|
self.allowpe = allowpe
|
|
|
|
def compare_string(self, output, result):
|
|
if output == result:
|
|
return 'AC'
|
|
if self.allowpe:
|
|
# 简化的PE检查
|
|
if ''.join(output.split()) == ''.join(result.split()):
|
|
return 'PE'
|
|
return 'WA'
|
|
|
|
|
|
def demo_internal_judge():
|
|
"""演示内置判题器的使用"""
|
|
print("=== 内置判题器演示 ===")
|
|
|
|
# 标准文本比较
|
|
ij_strict = InternalJudge(allowpe=False)
|
|
print("严格文本比较:")
|
|
result = ij_strict.compare_string("hello world\n", "hello world\n")
|
|
print(f" 'hello world\\n' vs 'hello world\\n' => {result}")
|
|
|
|
result = ij_strict.compare_string("hello world", "hello world\n")
|
|
print(f" 'hello world' vs 'hello world\\n' => {result}")
|
|
|
|
# 允许格式错误的比较
|
|
ij_pe = InternalJudge(allowpe=True)
|
|
print("\n允许格式错误的比较:")
|
|
result = ij_pe.compare_string("1 2 3 4 5\n", "1\n2\n3\n4\n5\n")
|
|
print(f" '1 2 3 4 5\\n' vs '1\\n2\\n3\\n4\\n5\\n' => {result}")
|
|
|
|
result = ij_pe.compare_string("12345\n", "1 2 3 4 5\n")
|
|
print(f" '12345\\n' vs '1 2 3 4 5\\n' => {result}")
|
|
|
|
|
|
def demo_custom_judge_config():
|
|
"""演示如何配置自定义验证程序"""
|
|
print("\n=== 自定义验证程序配置示例 ===")
|
|
|
|
# 浮点数比较验证程序代码
|
|
float_validator_code = """
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <cmath>
|
|
using namespace std;
|
|
|
|
const double EPS = 1e-9;
|
|
|
|
int main(int argc, char* argv[]) {
|
|
if (argc != 4) {
|
|
cout << "WA" << endl;
|
|
return 0;
|
|
}
|
|
|
|
ifstream expected(argv[2]);
|
|
ifstream result(argv[3]);
|
|
|
|
double exp_val, res_val;
|
|
if (!(expected >> exp_val) || !(result >> res_val)) {
|
|
cout << "WA" << endl;
|
|
return 0;
|
|
}
|
|
|
|
if (fabs(exp_val - res_val) <= EPS) {
|
|
cout << "AC" << endl;
|
|
} else {
|
|
cout << "WA" << endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
"""
|
|
|
|
print("浮点数比较验证程序配置:")
|
|
print(" 语言: gcc-3.3")
|
|
print(" 代码长度:", len(float_validator_code), "字符")
|
|
print(" 功能: 允许浮点数误差比较")
|
|
|
|
# 多解验证程序代码
|
|
multi_solution_code = """
|
|
import sys
|
|
|
|
def main():
|
|
try:
|
|
with open(sys.argv[2], 'r') as f:
|
|
expected = f.read().strip()
|
|
with open(sys.argv[3], 'r') as f:
|
|
result = f.read().strip()
|
|
|
|
exp_nums = sorted(map(int, expected.split()))
|
|
res_nums = sorted(map(int, result.split()))
|
|
|
|
if exp_nums == res_nums:
|
|
print("AC")
|
|
else:
|
|
print("WA")
|
|
except:
|
|
print("WA")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
"""
|
|
|
|
print("\n多解验证程序配置:")
|
|
print(" 语言: python-2.5")
|
|
print(" 代码长度:", len(multi_solution_code), "字符")
|
|
print(" 功能: 允许多种正确答案")
|
|
|
|
|
|
def demo_judge_usage_scenarios():
|
|
"""演示不同判题方式的使用场景"""
|
|
print("\n=== 判题方式使用场景 ===")
|
|
|
|
scenarios = [
|
|
{
|
|
"名称": "字符串精确比较",
|
|
"适用": "输出结果固定的算法题",
|
|
"示例": "计算1+1的结果",
|
|
"验证方式": "InternalJudge(allowpe=False)"
|
|
},
|
|
{
|
|
"名称": "字符串容错比较",
|
|
"适用": "允许格式差异的题目",
|
|
"示例": "输出多个数字,允许不同的分隔符",
|
|
"验证方式": "InternalJudge(allowpe=True)"
|
|
},
|
|
{
|
|
"名称": "文件大小+MD5校验",
|
|
"适用": "二进制文件输出",
|
|
"示例": "图像处理、音频处理等",
|
|
"验证方式": "文件级别的校验"
|
|
},
|
|
{
|
|
"名称": "自定义验证程序",
|
|
"适用": "复杂的判题逻辑",
|
|
"示例": "浮点数比较、多解题目、交互题等",
|
|
"验证方式": "ExternalJudge"
|
|
}
|
|
]
|
|
|
|
for i, scenario in enumerate(scenarios, 1):
|
|
print(f"{i}. {scenario['名称']}")
|
|
print(f" 适用场景: {scenario['适用']}")
|
|
print(f" 典型示例: {scenario['示例']}")
|
|
print(f" 实现方式: {scenario['验证方式']}")
|
|
print()
|
|
|
|
|
|
def main():
|
|
"""主演示函数"""
|
|
print("BitOJ 判题系统验证程序演示")
|
|
print("=" * 50)
|
|
|
|
demo_internal_judge()
|
|
demo_custom_judge_config()
|
|
demo_judge_usage_scenarios()
|
|
|
|
print("演示完成!")
|
|
print("\n更多示例文件:")
|
|
print(" - float_validator.cpp: 浮点数比较验证程序")
|
|
print(" - multi_solution_validator.py: 多解验证程序")
|
|
print(" - StringFormatValidator.java: 格式验证程序")
|
|
print(" - range_validator.cpp: 数值范围验证程序")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |