程序对拍(普通程序对拍&特判程序对拍)
目前SPJ的对怕程序不是很完善,多少会有算法不优等问题。如有问题敬请在评论区留言。【若转载请注明出处】
对拍程序初级版本,仅使用于非特判程序
需要实现如下图情况
@echo off
:start
rand.exe %random% > in.txt
oj.exe < in.txt > oj.txt
AC.exe < in.txt > AC.txt
fc oj.txt AC.txt
if not errorlevel 1 goto start
set /p in=<in.txt
echo %in%
pause
goto start
下面是python 操作的对拍程序,可实现spj对拍
需要实现如下图情况
如果非特判
若为特判
则需要再添加一个名为SPJ.exe的程序
import os
def get_str(dic):
f=open(dic,"r",encoding="utf-8")
string="".join(f.readlines())
f.close()
return string
def normal_cmp():
return True if get_str("AC.txt") == get_str("WA.txt") else False
def normal_error():
str_a=get_str("Rand.txt")
str_b=get_str("AC.txt")
str_c=get_str("WA.txt")
if len(str_a)>25:str_a="字符内容过长,请在Rand.txt中查看\n"
if len(str_b)>25:str_a="字符内容过长,请在AC.txt中查看\n"
if len(str_c)>25:str_a="字符内容过长,请在WA.txt中查看\n"
print("IN:\n{}\nAC:\n{}\nWA:\n{}".format(str_a,str_b,str_c))
def spj_cmp():
return True if get_str("spj.txt") == "YES" else False
def spj_error():
string=get_str("Rand.txt")
if len(string)>25:string="字符内容过长,请在Rand.txt中查看\n"
print("Rand:\n{}".format(string))
if input("若是spj输入spj,否则输入normal\n")!="spj":
os.system("Rand.exe > Rand.txt")
os.system("WA.exe < Rand.txt > WA.txt")
os.system("AC.exe < Rand.txt > AC.txt")
while normal_cmp():
print("未找到差异")
os.system("Rand.exe > Rand.txt")
os.system("WA.exe < Rand.txt > WA.txt")
os.system("AC.exe < Rand.txt > AC.txt")
normal_error()
else:
os.system("Rand.exe > Rand.txt")
os.system("WA.exe < Rand.txt > WA.txt")
os.system("AC.exe < Rand.txt > AC.txt")
f=open("spj.txt","w",encoding="utf-8")
f.writelines("".join([get_str("Rand.txt"),get_str("AC.txt"),get_str("WA.txt")]))
f.close()
os.system("SPJ.exe <spj.txt> spj.txt")
while spj_cmp():
print("未找到差异")
os.system("Rand.exe > Rand.txt")
os.system("WA.exe < Rand.txt > WA.txt")
os.system("AC.exe < Rand.txt > AC.txt")
os.system("SPJ.exe <rand.txt AC.txt WA.txt> spj.txt")
spj_error()
os.system("pause")