使用Python编写的对拍程序
简介
支持数据生成程序模式, 只要有RE或者WA的数据点, 就会停止
支持数据文件模式, 使用通配符指定输入文件, 将会对拍所有文件
结束后将会打印统计信息
第一次在某目录执行,将会通过交互方式获取配置, 生成配置文件, 以后读取配置文件运行
支持Linux和Windows系统
代码
#!/usr/bin/python3
import os
import json
import platform
import time
import glob
import shutil
def confirm(msg, helpi=''):
while True:
cmd = input("{} [yes]/no{} : ".format(msg, "/help" if helpi else ''))
if cmd == "no":
return False
elif cmd == "help" and helpi:
print(helpi)
else:
return True
def getinput(msg, helpi=''):
while True:
cmd = input("{} {} : ".format(msg, "<input>/help" if helpi else ''))
if cmd == "help" and helpi:
print()
print(helpi)
print()
elif cmd:
return cmd
settings = {}
if not os.path.isfile("checkx.json"):
try:
print("未找到checkx.json配置文件\n")
settings['std'] = getinput(
"标准程序源代码路径", "1. 不需要使用freopen\n2. 可以使用绝对路径或相对路径")
settings['target'] = getinput(
"测试程序源代码路径", "1. 不需要使用freopen\n2. 可以使用绝对路径或相对路径")
settings['ifpro'] = confirm(
"是否使用数据生成程序?", "若输入yes, 将会使用数据生成程序生成数据\n若输入no, 将会使用数据文件")
if settings['ifpro']:
settings['pro'] = getinput("数据生成程序路径", "源程序应该直接输出数据")
else:
settings['file'] = getinput(
"数据文件路径", "1. 可以使用绝对路径或相对路径\n2. 支持通配符")
with open("checkx.json", "w") as f:
f.write(json.dumps(settings))
except KeyboardInterrupt:
exit(0)
else:
with open("checkx.json", "r") as f:
settings = json.loads(f.read())
print("正在编译标准程序...", end='')
os.system("g++ {} -DDEBUG -o {}.out".format(settings['std'], settings['std']))
print("编译完成\n正在编译测试程序...", end='')
os.system(
"g++ {} -DDEBUG -o {}.out".format(settings['target'], settings['target']))
print("编译完成")
if "Windows" in platform.platform():
diffcmd = "fc /w target.out std.out > diff.out"
else:
diffcmd = "diff -ZE target.out std.out > diff.out"
count = 0
times = []
stdtimes = []
account = 0
if settings['ifpro']:
try:
while True:
count += 1
os.system(".{}{} > in.in".format(os.sep, settings['pro']))
zerotime = time.time()
os.system(".{}{} < in.in > std.out".format(os.sep, settings['std']+".out"))
begin = time.time()
stdtimes.append(begin-zerotime)
if not os.system("{} < in.in > target.out".format(settings['target']+".out")):
print()
print("# {} Runtime Error".format(count))
print("\n输入:\n")
with open("in.in", "r") as f:
print(f.read())
break
end = time.time()
times.append(end-begin)
if os.system(diffcmd):
print()
print("Wrong Answer")
print("\n输入:\n")
with open("in.in", "r") as f:
print(f.read())
print("\n标准程序输出:\n")
with open("std.out", "r") as f:
print(f.read())
print("\n测试程序输出:\n")
with open("target.out", "r") as f:
print(f.read())
print("\n差异比较:\n")
with open("diff.out", "r") as f:
print(f.read())
break
else:
account += 1
print("\r# {} Accepted {}s".format(
count, round(end-begin, 2)), end='')
except KeyboardInterrupt:
pass
else:
try:
for i in glob.glob(settings['file']):
count += 1
zerotime = time.time()
os.system(".{}{} < {} > std.out".format(os.sep, settings['std']+".out", i))
begin = time.time()
stdtimes.append(begin-zerotime)
if not os.system(".{}{} < {} > target.out".format(os.sep, settings['target']+".out", i)):
print("# {} Runtime Error".format(count))
print("\n输入保存在文件 result{}.in\n".format(count))
shutil.copy(i, "result{}.in".format(count))
continue
end = time.time()
times.append(end-begin)
if os.system(diffcmd):
print("# {} Wrong Answer".format(count))
print("\n输入保存在文件result{}.in\n".format(count))
shutil.copy(i, "result{}.in".format(count))
print("\n标准程序输出保存在文件 result{}.ans\n".format(count))
shutil.copy("std.out", "result{}.out".format(count))
print("\n测试程序输出保存在文件 result{}.out\n".format(count))
shutil.copy("target.out", "result{}.ans".format(count))
print("\n差异比较保存在文件 result{}.diff\n".format(count))
shutil.copy("diff.out", "result{}.diff".format(count))
else:
account += 1
print("# {} Accepted {}s".format(count, round(end-begin, 2)))
except KeyboardInterrupt:
pass
print("\n共测试 {} 个数据点".format(count))
if count:
print("{} 个数据点正确".format(account))
print("正确率 {} %".format(round(account/count*100, 2)))
if count:
print("标准程序在正确的数据点中:\n\t平均时间 {} s".format(round(sum(stdtimes)/count, 2)))
print("\t最长时间 {} s".format(round(max(stdtimes), 2)))
print("\t最短时间 {} s".format(round(min(stdtimes), 2)))
if account:
print("测试程序在正确的数据点中:\n\t平均时间 {} s".format(round(sum(times)/account, 2)))
print("\t最长时间 {} s".format(round(max(times), 2)))
print("\t最短时间 {} s".format(round(min(times), 2)))
os.remove("diff.out")
os.remove("std.out")
os.remove("target.out")
os.remove(settings['std']+".out")
os.remove(settings['target']+".out")
if settings['ifpro']:
os.remove("in.in")
使用Python编写的对拍程序的更多相关文章
- pyinstaller将python编写的打卡程序打包成exe
编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...
- 使用Python编写打字训练小程序【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/detail ...
- 使用Python编写打字训练小程序
你眼中的程序猿 别人眼中的程序猿,是什么样子?打字如飞,各种炫酷的页面切换,一个个好似黑客般的网站破解.可现实呢? 二指禅的敲键盘,写一行代码,查半天百度-那么如何能让我们从外表上变得更像一个程序猿呢 ...
- Python编写的记事本小程序
用Python中的Tkinter模块写的一个简单的记事本程序,Python2.x和Python3.x的许多内置函数有所改变,所以以下分为Python2.x和Python3.x版本. 一.效果展示: 二 ...
- 如何用python编写一个计时器的程序
python计时器的程序的代码和注释 import time as t #引入time模块 class MyTimer(): def __init__(self): #构造函数 ...
- 基于python编写的天气抓取程序
以前一直使用中国天气网的天气预报组件都挺好,可是自从他们升级组件后数据加载变得非常不稳定,因为JS的阻塞常常导致网站打开速度很慢.为了解决这个问题决定现学现用python编写一个抓取程序,每天定时抓取 ...
- 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)
上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...
- python 之 Django框架(服务器程序和应用程序、基础必备三件套及相关配置)
第十二章 Django框架 12.1 服务器程序和应用程序 服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处理.为了方便应用程序的开发, ...
- 【转载】Python编写简易木马程序
转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...
随机推荐
- js数组的常见操作( push、pop、unshift、shift、splice、concat、 join)的用法
1.数组添加删除 头部或尾部( push().pop().unshift().shift() ) 例2.数组尾部添加 push()方法可向数组的末尾添加一个或多个元素,并返回新的长度 语法:array ...
- Crypto++ AES 加密解密流程
// aesdemo.cpp : 定义控制台应用程序的入口点. // #include <stdio.h>#include <tchar.h>#include <iost ...
- nacos部署注意点
官方Naming Configuration Service https://nacos.io/zh-cn/docs/deployment.html 划重点 单机部署 单机部署默认嵌入式存储数据 支持 ...
- SpringBoot整合分布式ZooKeeper和Dubbo
ZooKeeper ZooKeeper是一个分布式的,开放远吗的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. 服务提供者 ...
- mtail 调试
mtail 调式 mtail 不会采集当前accesslog 内容以前的内容,只有当你启动mtail后,去访问你的监控tomcat,有新的access 日志刷入localhost_access_log ...
- Linux基础:pkill命令总结
本文只总结一些常用的用法,更详细的说明见man pkill和pkill --help. pkill命令 pkill命令:通过进程名杀死进程. 语法格式 Usage: pkill [options] & ...
- 关于UDP的检验和计算(附代码)
关于UDP的检验和计算(附代码) 在下午的学习过程中https://www.cnblogs.com/roccoshi/p/13032356.html 有一张图讲述了UDP的校验方法, 如下: 老师只粗 ...
- 循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用
在VUE+Element 前端应用中,图标是必不可少点缀界面的元素,因此整合一些常用的图标是非常必要的,还好Element界面组件里面提供了很多常见的图标,不过数量不是很多,应该是300个左右吧,因此 ...
- kill杀死进程
[root@queen ~]# kill 选项 %进程号 选项与参数: -l :这个是L 的小写,列出kill 能够使用的signal - :重新读取一次参数的设定档(类似reload) - :代表与 ...
- const变量的修改
int main(){ const char a[]="hello world"; char *aa=(char *)a; printf("\nthe a address ...