摘要:考试数据生成辅助程序 Python3实现

这个辅助程序是为了给同学们组互测时,方便生成数据用的,程序可以实现自动调用数据生成器生成编号自定义的数据,并调用根目录下的标程进行读取对拍并输出程序运行时间。无论是Linux或者是Windows都可以使用,程序会自动给数据生成器传入两个参数 :测试点编号和程序提供的随机种子(由于time会出现1秒里种子一样的情况。

说明 :

您需要放如下三个cpp文件在程序根目录下 : Gen_1.cpp \ Std_1.cpp \ Std_2.cpp 程序会自动编译它们。接着,您可以使用终端来直接解释该程序, 程序会要求您输入题目名字,并自动在程序目录下新建一个文件夹来储存生成的数据。 接下来,题目会要求您输入测试点编号的左闭右闭区间,如果停止构造数据,请输入两个0。您可以在不同测试数据范围之间直接修改Gen_1.cpp,程序会在每个区间编译一次您的程序。本程序读取到对拍文件不同时,会自动再生成一组数据对拍,如果仍然不同,本程序会退出并建议您修改标程或者数据生成器。

请注意 :本程序调用的diff时不忽略空格和换行的,请您使用的时候注意这一点。

下面是程序源代码及测试生成器

源代码:

# A Simple Data Generator For OIers By Yirannn # Made By Python# Have Fun to Generator Data !import osimport randomimport sysfrom time import time# 预处理FErr = open("Err.Log", "w")sys.stderr = FErr# 输入提示print("请按如下格式补充留在本文件夹的文件")print("请注意 为保证数据生成随机,本程序会对main函数传一个参数, 请使用该参数作为随机种子")print("输入数据生成器 : Gen_1.cpp")print("输出数据生成器 : Std_1.cpp")print("输出数据对拍器 : Std_2.cpp")print("本程序编译命令 : g++ %s.cpp -o %s.exe -O2 -std=c++11")Problem_Name = input("请输入题目英文名,本程序将在程序根目录下创建该名字文件夹并导出数据\n")while(Problem_Name == "") : Problem_Name = input("请输入题目英文名,本程序将在程序根目录下创建该名字文件夹并导出数据\n")# Need_Spj = input("如果需要Special Judge 请将Spj程序编译好放在根目录下, 并输入1, 否则输入0")# 系统识别Operator_System = 2 if os.name == "nt" else 1Clear_Screen = ""Test = ""Exist = os.path.exists(Problem_Name)Error = Falseif Operator_System == 1 : Clear_Screen = "clear" Test = "diff " if (Exist != True) : os.system("mkdir " + "\"" + Problem_Name + "\"")else : Clear_Screen = "cls" Test = "fc " if (Exist != True) : os.system("md " + Problem_Name)# 数据生成while(True) : while True : try : From, End = input("请输入数据编号范围 生成完毕请输入两个0\n").split() break except : print("请输入两个正常的数字!") os.system(Clear_Screen) From = int(From) End = int(End) if End == 0 : break os.system("g++ Gen_1.cpp -o Gen_1.exe -O2 -std=c++11") os.system("g++ Std_1.cpp -o Std_1.exe -O2 -std=c++11") os.system("g++ Std_2.cpp -o Std_2.exe -O2 -std=c++11") Execute = "./" if Operator_System == 1 else "" for i in range(From, End+1) : Num = str(i) RandomSeed = str(random.randint(1, 100000000)) os.system(Execute + "Gen_1.exe " + Num + " " + RandomSeed + " > " + Problem_Name + "/" + Num + ".in") Start_Time = time() os.system(Execute + "Std_1.exe < " + Problem_Name + "/" + Num + ".in > " + Problem_Name + "/" + Num + ".out") OverA_Time = time() os.system(Execute + "Std_2.exe < " + Problem_Name + "/" + Num + ".in > " + Problem_Name + "/" + Num + ".ans") OverB_Time = time() Jud = os.system(Test + Problem_Name + "/" + Num + ".out " + Problem_Name + "/" + Num + ".ans") if Jud != 0 : RandomSeed = str(random.randint(1, 100000000)) print("WA On Gen", Num) print("正在尝试重新生成一组数据,请稍候") os.system(Execute + "Gen_1.exe " + Num + " "+ RandomSeed + " > " + Problem_Name + "/" + Num + ".in") os.system(Execute + "Std_1.exe < " + Problem_Name + "/" + Num + ".in > " + Problem_Name + "/" + Num + ".out") os.system(Execute + "Std_2.exe < " + Problem_Name + "/" + Num + ".in > " + Problem_Name + "/" + Num + ".ans") Jud = os.system(Test + Problem_Name + "/" + Num + ".out " + Problem_Name + "/" + Num + ".ans") if Jud != 0 : print("您的数据生成器或者标程可能出问题了,请修改后再次生成!") Error = True sys.exit(1) else : print("AC On Gen ", Num, "Runtime : Std_1 : %f && Std_2 : %f" %(OverA_Time - Start_Time, OverB_Time - OverA_Time)) os.system("rm " + Problem_Name + "/" + Num + ".ans") if(Error) : break# 感谢使用print("感谢使用本生成器, 更多功能还在完善中, 如果发现Bug/有好的Idea请联系Yirannn@yirannn.com")print("再见!")os.system("rm Gen_1.exe")os.system("rm Std_1.exe")os.system("rm Std_2.exe")Exist = os.path.exists("Err.log")close(FErr)if(Exist) : os.system("rm Err.log")

测试生成器 :

#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int main(int argc, char *argv[]) { string RandSeed = argv[argc-1], T = argv[argc-2]; int seed, number; sscanf(RandSeed.c_str(), "%d", &seed); sscanf(T.c_str(), "%d", &number); srand(seed); rand(); int A = rand(), B = rand(); printf("%d %d\n", A, B);}