对拍器的功能就是可以随机造数据对比两份代码的输入输出,来看自己哪里错了,一般用于做oj题目。
本来想用java来写,那个system命令执行不了g++(可能是我使用的方法不对)。
所以改用python写了个仅限于对拍C/C++,其实实现很简单就是通过cmd来编译运行cpp,并获取运行结果
进行对比。
讲一下具体运用场景,比如你在写a + b这道题下面是正确代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
没准你写错了,写成了这个:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
if (a == 1 && b == 1)
cout << a + b + 1 << endl;
else
cout << a + b << endl;
return 0;
}
现在你不知道哪里错了,万念俱灰,这时你的朋友给了你一份正确代码,你想知道哪里错了。
你就可以随机造些数据来看自己代码跟他的代码输出差异。
没错下面这份py就可以实现这个功能。
A,B分别放上两份要对拍的代码,spath存放样例数据,brk是最大对拍次数,get函数用来生成你要造的数据
当然造的数据格式要跟题目所规定的方式一样。
import os
import random
import sys
A = "D:\sublime\A" #A文件位置
B = "D:\sublime\B" #B文件位置
spath = "D:\input.txt" #生成数据文件
brk = 500 #最多对拍次数
def init(): #初始化编译文件
os.system("g++ " + A + ".cpp -o " + A + ".exe -std=c++11")
os.system("g++ " + B + ".cpp -o " + B + ".exe -std=c++11")
def rand(l, r):
return str(random.randint(l, r))
def crand(s):
if s == "":
print("随机字符长度不能为空")
sys.exit(0)
else:
s = str(s)
len1 = len(str(s))
return s[int(rand(0, len1 - 1))]
def get(): #随机函数
p = open("D:\input.txt", "w")
s = ""
s += rand(1, 4) + " " + rand(1, 4)
p.write(s)
return s
init() #c++别忘了初始化
cnt = 0 #初始化对拍次数
while True:
cnt += 1
sample = get()
a = os.popen(A + ".exe < " + spath)
b = os.popen(B + ".exe < " + spath)
ansA = a.read()
ansB = b.read()
if ansA != ansB:
print("sample" + str(cnt) + ":Wrong!\n" + sample + '\n')
print("ansA:\n" + ansA)
print("ansB:\n" + ansB)
break
else:
if cnt != brk:
print("sample" + str(cnt) + ":Right!")
else:
print(str(brk) + "组数据未有错误,停止对拍")
break
input()
如果你有pycharm,你可以直接用pycharm来运行这份代码。
pycharm运行结果:
在这份代码里面get函数中先是随机了一个1到4的数字,又随机了一个1到4的数字
然后在同时随机到两个数字为1的时候出现了错误,所以这个时候你就会发现你代码
对于1 1这个数据跑不过去,然后你一改就对了。
如果你没有安装pycharm,你可以新建一个.py文件,当然你电脑要安装了python才行,
然后把对拍代码放进去,右击-打开方式-python,然后运行即可。
对于随机生成字符
crand("字符")
例如你要生成的字符有a,b,c
你需要crand("abc"),当然你如果crand("aaaaabc"),那么随机到字符a的概率会
明显大于其他字符。
例如下面的两份代码,要求是无论输入什么都输出”YES“。
正确代码:
#include <stdio.h>
#include <string.h>
#include <unordered_map>
int main()
{
char s[10];
scanf("%s", s);
puts("YES");
return 0;
}
你又写错了:
#include <stdio.h>
#include <string.h>
#include <unordered_map>
int main()
{
char s[10];
scanf("%s", s);
if (strcmp(s, "aaa") == 0)
puts("NO");
else
puts("YES");
return 0;
}
在万念俱灰的时候,你的朋友又给了你一份代码。
-----
现在你要把对拍代码里面的随机函数修改成随机输出字符,假设题目中是输入一个长度为3的
字符串,里面含有a,b,c,d,e五个字符。你的随机函数就可以按如下来生成,返回的s即是你生成的数据。
def get(): #随机函数
p = open("D:\input.txt", "w")
s = ""
for i in range(1, 4):
s += crand("abcde")
p.write(s)
return s
这题的对拍结果,当样例输入的是”aaa“时, 你又发现你的程序出现了错误,然后你一改就对了。
pycharm运行结果:
随机出来的数据是由你自己来做的,一般是按照题目要求。
现在功能还有点薄弱,没加special judge。