使用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编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...
随机推荐
- 云服务器部署Web项目
接着上一篇整好MySQL数据库了,部署Web项目的重要一步就完成了,接下来就是整Tomcat发布项目了,这个博主用的是宝塔面板,所以,也很简单,直接在宝塔面板软件商店选择对应的Tomcat版本安装就行 ...
- Jmeter之Json提取器详解(史上最全)
参考资料:https://www.bbsmax.com/A/D854lmBw5E/ Jsonpath在线测试:http://jsonpath.com/ 实际工作中用到的一些场景: 提取某个特定的值 提 ...
- MongoDB 4.X CRUD基本操作
本文总结了MongoDB 4.X在mongo shell客户端涉及的对文档一些基本的增删改查操作,即CRUD操作.主要结合了自己平时使用MongoDB的操作命令,更详细的命令可以参考官方文档: htt ...
- [转] C++项目中的extern "C" {}
点击阅读原文 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #if ...
- Quartz.Net系列(三):解读Quartz.Net源码领略设计模式在其中的应用
1.Builder(建造者)模式 JobBuilder DateBuilder 其他的Builder(TriggerBuilder.SchedulerBuilder等) 2.抽象工厂模式 ISch ...
- (十)自动化测试pom完整文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 记linux vsftpd配置遇到的错误
环境:centos 7 yum安装 yum install -y vsftpd 增加用户 # 家目录为/www 并设置nologin useradd -d /www -s /sbin/nologin ...
- Java容器相关知识点整理
结合一些文章阅读源码后整理的Java容器常见知识点.对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献. 1. 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看上去右半部分很 ...
- ca69a.cpp_c++_函数匹配(重载确定)
/*ca69a.cpp_c++_函数匹配(重载确定)#重载确定的三个步骤1.候选函数2.选择可行函数3.寻找最佳匹配(如果有的话)#含有多个形参的重载确定 void f1();void f1(int) ...
- EduSoho二次开发功能:单词本使用说明
测试地址:http://shanxue.edusoho.site/ 管理账号:test 管理密码:123456 针对英语或其他语言进行单词展示,索引功能.可以针对单词进行最多三级的分类筛选,以及不限数 ...