简介

支持数据生成程序模式, 只要有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编写的对拍程序的更多相关文章

  1. pyinstaller将python编写的打卡程序打包成exe

    编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...

  2. 使用Python编写打字训练小程序【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/detail ...

  3. 使用Python编写打字训练小程序

    你眼中的程序猿 别人眼中的程序猿,是什么样子?打字如飞,各种炫酷的页面切换,一个个好似黑客般的网站破解.可现实呢? 二指禅的敲键盘,写一行代码,查半天百度-那么如何能让我们从外表上变得更像一个程序猿呢 ...

  4. Python编写的记事本小程序

    用Python中的Tkinter模块写的一个简单的记事本程序,Python2.x和Python3.x的许多内置函数有所改变,所以以下分为Python2.x和Python3.x版本. 一.效果展示: 二 ...

  5. 如何用python编写一个计时器的程序

    python计时器的程序的代码和注释 import time as t #引入time模块 class MyTimer():     def __init__(self): #构造函数         ...

  6. 基于python编写的天气抓取程序

    以前一直使用中国天气网的天气预报组件都挺好,可是自从他们升级组件后数据加载变得非常不稳定,因为JS的阻塞常常导致网站打开速度很慢.为了解决这个问题决定现学现用python编写一个抓取程序,每天定时抓取 ...

  7. 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)

    上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...

  8. python 之 Django框架(服务器程序和应用程序、基础必备三件套及相关配置)

    第十二章 Django框架 12.1 服务器程序和应用程序 服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处理.为了方便应用程序的开发, ...

  9. 【转载】Python编写简易木马程序

    转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...

随机推荐

  1. 震惊!当Python遇到Excel后,将开启你的认知虫洞

    本文主要内容:   1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...

  2. 算法讲堂二:组合数学 & 概率期望DP

    组合数学 1. 排列组合 1. 加法原理 完成一列事的方法有 n 类,其中第 i 类方法包括\(a_i\)种不同的方法,且这些方法互不重合,则完成这件事共有 \(a_1 + a_2 + \cdots ...

  3. linux pinmux 引脚多路复用驱动分析与使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/code_style/article/de ...

  4. Java 多线程基础(六)线程等待与唤醒

    Java 多线程基础(六)线程等待与唤醒 遇到这样一个场景,当某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制. 一 ...

  5. cb24a_c++_STL算法简介

    算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成.       <algorithm>是所有STL ...

  6. django xadmin 配置过程

    1.拷贝xadmin的一个下的一个xadmin文件夹放到项目里

  7. 007.OpenShift管理应用部署

    一 REPLICATION CONTROLLERS 1.1 RC概述 RC确保pod指定数量的副本一直运行.如果pod被杀死或被管理员显式删除,复制控制器将自动部署相应的pod.类似地,如果运行的po ...

  8. docker已运行容器里的时区修改

    ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime 或者 cp /usr/share/zoneinfo/Asia/Shanghai  ...

  9. springboot 2.X 集成redis

    在实际开发中,经常会引入redis中间件做缓存,这里介绍springboot2.X后如何配置redis 1 Maven中引入redis springboot官方通过spring-boot-autoco ...

  10. 【Flutter实战】定位装饰权重组件及柱状图案例

    老孟导读:Flutter中有这么一类组件,用于定位.装饰.控制子组件,比如 Container (定位.装饰).Expanded (扩展).SizedBox (固定尺寸).AspectRatio (宽 ...