# 3.13 设置特殊运行和比较程序

为了解决不符合固定输入和/或输出的方案的题目, DOMjudge 可以更改提交被运行和判断是否正确的方式

处理提交的运行和检查的后端脚本 `testcase_run.sh` 调用单独的程序来运行提交和比较结果; 这些可以进行单独地设置并适应每个问题的需求; 为此, 必须创建上几节所述 的可执行文档; 然后必须在题目的 `special_run` 和/或 `special_compare` 字段选择可执行文件 (空值表示使用默认的运行和比较脚本; 可以在全局设置中设置这些默认值); 在创建自定义运行和比较程序时, 我们建议重新使用处理繁琐标准部件的脚本; 详情参见 `boolfind` 示例

## 比较程序

比较程序/脚本应该遵循 [Kattis/problemarchive 输出验证器格式](http://www.problemarchive.org/wiki/index.php/Output_validator). DOMjudge 使用那里指定的 [默认输出验证器](http://www.problemarchive.org/wiki/index.php/Problem_Format#Output_Validators) 作为默认值, 可以在 [https://github.com/Kattis/problemtools/blob/master/support/default\_validator/](https://github.com/Kattis/problemtools/blob/master/support/default_validator/) 找到

**注意**: DOMjudge 只支其中描述功能的子集, 特别的, 调用语法是:

```
/path/to/compare_script/run <testdata.in> <testdata.ans> <feedbackdir> <compare_args> < <program.out>
```

其中 `testdata.in` `testdata.ans` 是参考输入输出文件, `feedbackdir` 要写入包含例如评测响应文件 `judgemessage.txt` (仅允许的其他文件有 `teammessage.txt` `score.txt` `judgeerror.txt` `diffposition.txt`), `compare_args` 是一个可以在配置比赛题目时设置的参数列表, `program.out` 是队伍的输出; 验证程序不应该对它的工作目录做出任何假设

有关编写和修改比较(验证器)脚本的更多详细信息, 请参阅 `boolfind_cmp` 示例和文件 `testcase_run.sh` 的顶部的注释

## 运行程序

特殊运行程序可以在某些情况下使用, 例如, 为了创建一个交互式问题, 其中参赛者的程序和评测程序交换信息, 并根据自己的输出接收数据; `boolfind` 问题作为交互式问题的示例包含在内, 请参阅 `docs/examples/boolfind.pdf` 获取问题描述

用法和比较程序类似: 你可以自己创建一份程序, 或者使用我们提供的脚本, 它处理评测程序和参赛者程序在 stdin/stdout 上的双向通信(参见 `boolfind_run` 可执行文档中的 `run` 文件).

对于第一种情况, 程序必须接受和 `run_wrapper` 相同的调用语法, 语法记录在该文件中; 使用 `run_wrapper` 时, 应将其复制成 `run` 到你的可执行文档中; 裁判必须编写一个名为 `runjury` 的程序, 并接受调用语法:

```
runjury <testdata.in> <program.out>
```

其中参数分别是是读取测试数据和输出写入的文件; 该程序将通过 stdin/stdout 和参赛者的程序之间进行通信; 还必须创建一个特殊的比较程序, 因此写入 \ 的数据并不重要, 只要比较程序可以从内容中推断出参赛者程序的正确性就行
