Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

对拍器 Compare

Mr. Python edited this page Oct 19, 2024 · 10 revisions

对拍器 Compare

将对拍器与您的数据生成器结合使用,您可以方便地检测您的程序的正确性。

  1. 对拍输出文件
# 默认比较器为NOIP风格,忽略最后空行和行尾空格
Compare.output("1.out", "2.out", std="std.out") 
# 以std.out为标准,对比1.out和2.out的正确性
std_io = IO()
std_io.output_writeln(1, 2, 3) # 往std_io的output里写入一些东西
Compare.output("1.out", "2.out", std=std_io) 
# 以std_io这个IO对象中的output为标准,对拍1.out和2.out,
  1. 对拍程序
input_io = IO()
input_io.input_write("1111\n")
Compare.program("a.exe", input=input_io, std_program="std.exe") 
# 以input_io这个IO对象中的input为stdin输入。
# std.exe的输出为标准输出,以此为标准对拍a.exe的输出。
Compare.program("a.exe", "b.exe", input=input_io, std_program="std.exe") 
# 和上面的方法类似,但是你可以以std.exe为标准对拍多个程序输出。
Compare.program("a.exe", "b.exe", "c.exe", input="data.in", std="std.out") 
# 当然input也可以简单地是文件,并以std.out这个输出文件的内容来对a.exe, b.exe, c.exe对拍。
# 这里std也可以是IO对象。
while True:
 input_io = IO()
 input_io.input_writeln(randint(1,100))
 Compare.program("a.exe", "b.exe", input=input_io, std_program="std.exe") 
# 不断地生成测试数据(这里是1到100的随机数),然后放到a.exe,b.exe中,分别以std.exe为标准进行对拍比较
# CYaRon 现在使用多线程比较器,原 stop_on_incorrect 参数现已 deprecated 且无实际作用。

对于对拍程序的附加提示:CYaRon将每一个参数视为shell命令执行,也就是说在Linux下有必要写成./a, ./b等。

  1. 使用其他比较器

CYaRon内置NOIPStyleFullText两种比较器,默认为NOIPStyle,更换比较器的方法如下:

Compare.program("a.exe", input=input_io, std_program="std.exe", grader="FullText")

您也可以自己撰写比较器,请参考如下的代码示例。

from cyaron import *
from cyaron.graders import CYaRonGraders
@CYaRonGraders.grader("MyGrader")
def my_grader(content, std):
 if is_correct: # 请自行改为判断是否正确的逻辑
 return True, None
 else:
 return False, "Answer incorrect!"
Compare.program("a.exe", input=input_io, std_program="std.exe", grader="MyGrader")

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /