OI工具:Python数据生成辅助程序 – [Python/原创]

摘要:考试数据生成辅助程序 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 os
import random
import sys
from 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 1
Clear_Screen = ""
Test = ""
Exist = os.path.exists(Problem_Name)
Error = False
if 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 
#include 
#include 
#include 
#include 
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);
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注