欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 在Linux or Windows中如何优雅的写出对拍

在Linux or Windows中如何优雅的写出对拍

2024/11/30 14:48:28 来源:https://blog.csdn.net/Ten_years_star/article/details/139579950  浏览:    关键词:在Linux or Windows中如何优雅的写出对拍

在Linux or Windows中如何优雅的写出对拍

  • 一、前言
  • 二、结论
    • 1、对拍
  • 三、对拍详解
    • 1、什么是对拍呢?🧐
    • 2、对拍的组成部分
    • 3、输入数据生成
    • 4、对拍程序
    • 5、操作流程
  • 四、最后

一、前言

网上的对拍程序层出不穷,大多LinuxWindows中的对拍程序都是独立开的(在Windows中用.bat,在Linux中用.sh),那么有没有一种方法使之统一起来呢?🤔答案是有的!🥳

二、结论

对于有基础的同学直接看结论就行了。用Cppsystem()函数调用系统命令,来写对拍程序就可以了。其中记住以下几点就行

  1. Windows中可执行文件后缀名为.exe,Linux中可执行文件后缀名为.out。在对应系统生成对应程序。(这个应该都没问题把🧐)

  2. 对拍的核心就是判断绝对AC的程序与现有程序输出是否一致

    • Linux中使用diff
    • Windows中使用fc

1、对拍

Windows

#include<bits/stdc++.h>
using namespace std;void slove() {while (true) {system("gen.exe > tmp.in");system("F.exe < tmp.in > tmp.out");system("F_AC.exe < tmp.in > tmp_AC.out");if (system("fc tmp.out tmp_AC.out")) {cout << "WA" << endl;return;} else cout << "AC" << endl;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;/*cin >> t;*/while(t--) slove();return 0;
}

Linux

#include<bits/stdc++.h>
using namespace std;void slove() {while (true) {system("gen.out > tmp.in");system("F.out < tmp.in > tmp.out");system("F_AC.out < tmp.in > tmp_AC.out");if (system("diff tmp.out tmp_AC.out")) {cout << "WA" << endl;return;} else cout << "AC" << endl;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;/*cin >> t;*/while(t--) slove();return 0;
}

三、对拍详解

1、什么是对拍呢?🧐

判断绝对AC的程序与现有程序输出是否一致

简单来说,用代码生成 输入数据,再把生成的输入数据分别喂给已知能AC的程序和不确定能AC的程序,找出让这两个程序输出不一致的 输入数据

2、对拍的组成部分

对拍的组成部分

3、输入数据生成

目标:用程序随机自动生成输入数据
做法:用srand() + time()函数生成随机数
注意的点

  • Windowssrand()随机数的范围为0 ~ 32767
  • Linuxsrand()随机数的范围为0 ~ 2147483647
  • 哪我们如果数据范围在 long long怎么办呢?请看我封装的random()函数
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;/*
// random ---> 生成数据范围在[l,r]的随机数
// Linux
ll random(int l, int r) { return (ull)rand() * rand() % (r - l + 1) + l;
}
*/// Windows
ll random(int l, int r) { return (ull)rand() * rand() * rand() * rand() % (r - l + 1) + l;
}void slove() {srand((unsigned)time(0));int n = random(1, 10);cout << n << endl;
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;/*cin >> t;*/while (t--) slove();return 0;
}

4、对拍程序

基础知识

  • F.exe < tmp.in 代表输入重定向。它的作用是将一个文件的内容作为输入传递另一个程序。
  • Linux中的diffWindows中的fc,代表比较两个文件中的内容是否一致。

Windows

#include<bits/stdc++.h>
using namespace std;void slove() {while (true) {system("gen.exe > tmp.in");system("F.exe < tmp.in > tmp.out");system("F_AC.exe < tmp.in > tmp_AC.out");if (system("fc tmp.out tmp_AC.out")) {cout << "WA" << endl;return;} else cout << "AC" << endl;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;/*cin >> t;*/while(t--) slove();return 0;
}

Linux

#include<bits/stdc++.h>
using namespace std;void slove() {while (true) {system("gen.out > tmp.in");system("F.out < tmp.in > tmp.out");system("F_AC.out < tmp.in > tmp_AC.out");if (system("diff tmp.out tmp_AC.out")) {cout << "WA" << endl;return;} else cout << "AC" << endl;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;/*cin >> t;*/while(t--) slove();return 0;
}

5、操作流程

执行对拍程序就可以等待,程序停止,程序停止就代表程序找到WA的数据。这时我们只需要打开tmp.in查看这份数据就可以啦!🥳

四、最后

创作不易,如有帮助,点个赞鼓励一下吧!万分感谢!!!😭

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com