在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

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ