实现简单的对拍

自带WA自动机属性的ACMer,经常会遇到无限提交然后就是wa的情况,但是就是不知道自己到底哪里出错了。除了cf之类的网站能得到部分数据以外,很难有网站会告诉你数据。所以可以暴力写一发或者找一个正确的cpp文件,产生几组随机数,简单跑几次,,如果出现两者不一样的情况,再做分析。对拍就完成了这么一个功能。


首先,对拍的前提是你的暴力代码是完全正确的,你的随机数产生的数据是完全符合题意的。


以a+b为例,来了解一下最简单的对拍小程序。

先写一个错误的cpp文件,命名为my_cpp。

#include<bits/stdc++.h>
using namespace std;

int main()
{  
    int a,b,ans;  
    scanf("%d%d",&a,&b);
 	ans=a*b;
	printf("%d\n",ans);
	
    return 0;
}



然后,运行此cpp,得到一个.exe文件。

然后写一个正确的cpp文件,命名为test。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int a,b;
	long long ans;  
	scanf("%d%d",&a,&b);
	ans=a-b;
	printf("%lld\n",ans);
	return 0;
}


运行此cpp,同样得到一个.exe文件。

然后写一个产生随机数的cpp,命名为data。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	srand(time(0));
	int a,b;
	a=rand()*100,b=rand();
	printf("%d %d\n",a,b);
	return 0;
}


得到三个exe文件,将这三个exe文件放在同一个文件夹内。

然后建立一个.txt文件,内容是:

:again  
data > input.txt  
my_cpp < input.txt > my_cpp_output.txt  
test < input.txt > test_output.txt  
fc biaoda_output.txt test_output.txt  
if not errorlevel 1 goto again  
pause 
注意文件的名称一定要一致。

然后保存此txt,将后缀改为.bat。运行此bat文件。

就会得到这样的结果,错误数据会自动写入input文件中。



还有一种方法,将bat文件写成cpp文件,编译运行得到exe文件,运行exe文件会得到同样的结果。

代码:

#include<iostream>  
#include<windows.h>  
using namespace std;  
int main()  
{
	int t=0;
    while(1)  
    {
        system("data.exe > data.txt");  
        system("my_cpp.exe < data.txt > my_cpp.txt");  
        system("test.exe < data.txt > test.txt");  
        if(system("fc test.txt my_cpp.txt"))   
        {
        	t=1;
        	break;
		}
    }  
    if(t==0) 
	cout<<"no error"<<endl;  
    else cout<<"error"<<endl; 
    getchar();
    return 0;  
}  

linu下的代码:

#!/bin/bash
while true; do
    ./data > data.in
    ./std <data.in >std.out
    ./Todobe <data.in >Todobe.out
    if diff std.out Todobe.out; then
        printf "AC\n"
    else
        printf "Wa\n"
        exit 0
    fi
done


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值