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

2024-06-11 02:52
文章标签 linux windows 优雅 写出

本文主要是介绍在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查看这份数据就可以啦!🥳

四、最后

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

这篇关于在Linux or Windows中如何优雅的写出对拍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050012

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解