对拍器/对数器

对拍器的功能就是可以随机造数据对比两份代码的输入输出,来看自己哪里错了,一般用于做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函数用来生成你要造的数据

当然造的数据格式要跟题目所规定的方式一样。

扫描二维码关注公众号,回复: 11887433 查看本文章
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。

猜你喜欢

转载自blog.csdn.net/weixin_43731933/article/details/103534008