美文网首页
Linux下shell脚本对拍

Linux下shell脚本对拍

作者: Steven1997 | 来源:发表于2018-04-09 00:35 被阅读118次

在算法竞赛中,我们常常会遇到一道题一直WA的情况,这时我们不得不自己造样例,这会耗费大量时间,而且还不一定能快速确定样例的答案。所以,如果时间充足,可以写一个对拍程序。
对拍程序需要四个文件:
1.我们已经写好但WA的待测试文件,记为code.cpp
2.一个纯暴力程序(复杂度高但能保证答案一定正确),记为std.cpp
3.一个数据生成器(用srand函数和rand函数产生随机数即可),记为data.cpp
4.一个用于比较输出的shell脚本,记为duipai.sh
对拍程序,顾名思义,就是随机生成数据给两个程序分别跑一遍,看看对不对的上。

我们以一个计算1到n的和的程序为例,我们都知道计算1到n的暴力方法是用循环加和,简便方法则是使用等差数列求和公式。

下面是待测试程序code.cpp(等比数列求和,当然这里没有WA)

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  cout<<n * (n + 1) / 2<<endl;
  return 0;
}

下面是暴力求和程序std.cpp

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  cin>>n;
  int ans = 0;
  for(int i = 1;i <= n;i++){
   ans += i;
  }
  cout<<ans<<endl;
  return 0;
}

然后是随机数据生成器data.cpp

#include<bits/stdc++.h>
using namespace std;
int main(){
  srand(time(0));
  int n = 100;
  while(n--){
  int k = rand() % 10 + 1; //生成100个[1,10]的随机数
  cout<<k<<endl;
  }
 return 0;
}

rand函数和srand函数的用法有点忘了,参见:有关rand(),srand()产生随机数学习总结

最后是duipai.sh

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

这个程序的意思是运行三个可执行文件,比较std.out code.out是否相同,相同输出"AC",不相同输出错误信息,并输出"WA"且退出。

下面开始跑对拍,先用g++编译三个cpp文件,g++ code.cpp -o code,g++ std.cpp -o std,g++ data.cpp -o datag++ code.cpp -o code表示将code.cpp编译并连接生成一个名为code的可执行文件,如果不加 -o 选项,所有cpp文件都默认生成一个名为a.out的可执行文件。通过./a.out可以运行这个可执行文件,./表示当前目录。如果加上 -c 选项,如g++ -c code.cpp -o code则只编译不连接,会产生一个obj文件而不是exe文件。

编译完成后,输入sh duipai.sh即得结果。

相关文章

  • Linux下shell脚本对拍

    在算法竞赛中,我们常常会遇到一道题一直WA的情况,这时我们不得不自己造样例,这会耗费大量时间,而且还不一定能快速确...

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • 指令随笔

    linux 修改shell脚本的编码 在window下编写的shell脚本编码为dos,在linux环境下不能直接...

  • linux shell脚本攻略笔记

    LINUX SHELL脚本攻略笔记[速查] linux shell脚本攻略笔记

  • Shell编程基础

    一. 前言 在介绍Shell脚本之前,我们先来看一下什么是Shell。对Linux Shell的定义如下: Sh...

  • 整理linux基础命令|2018-10-23

    shell快捷键 | linux 下常用两种脚本 shell - - unix -- Bourne shell b...

  • Shell脚本学习:spark2-shell启动流程分析

    摘要:Spark,Linux,Shell 学习一下spark2-shell的启动shell脚本,分析一下spark...

  • Linux下获取Pci-E设备列表

    在linux系统下获pcie设备列表的shell脚本

  • 17. Interview-Linux

    1 用过哪些Linux命令? 2 写过shell脚本吗?shell脚本基本格式? 3 Linux I/O读写方式 ...

  • shell脚本入门

    .sh结尾的就是shell脚本,一般来讲,在linux下,都是bin shell,当然还有什么c shell,说白...

网友评论

      本文标题:Linux下shell脚本对拍

      本文链接:https://www.haomeiwen.com/subject/ibevhftx.html