MacOS下ACM竞赛CPP程序对拍

简述:

对于信息学竞赛来说,对拍是一个极其重要的技巧,他可以利用一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序。

简单点来说,在比赛过程中,相信大家都经历过写的程序莫名其妙wa了,但是自己手模小数据都没问题的情况,甚至可能自闭到认为是评测姬的问题,这个时候就可以利用对拍来让自己认清wa了的现实,我们可以通过写一个复杂度巨高但绝对正确的暴力,再根据题目代码需求写一个数据生成程序,让暴力代码和wa了的代码同时跑,再写一个运行与结果比较的脚本,实现“简易的评测姬”。如果出现差异就证明你就是wa了!这个时候就可以拿着数据愉快的debug了

当然,如果拍不出来,也不要怀疑评测姬,绝对是你读错题了

Windows的对拍的方法已经遍地都是,但是针对MAC用户却没什么好的博客介绍,所以我今天主要介绍MAC用户如何实现程序对拍

前置准备

Sublime Text

简单介绍一下Sublime Text,他是一个轻量级的文本编辑器,以界面简洁优美闻名

下载的话直接去官网下载即可

简单配置一下Sublime Text

  • 点击Tools->Build System->Build New System

  • 然后输入一下配置:(直接全粘贴过去就行

    {
        "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}'"],
        "file_regex": "^(..{FNXX==XXFN}*):([0-9]+):?([0-9]+)?:? (.*)$",
        "working_dir": "${file_path}",
        "selector": "source.c, source.c++",
        "variants":
        [
            {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}' && open -a Terminal.app '${file_path}/${file_base_name}'"]
            }
        ]
    }
    
    
    
  • 然后按然后按Command+S保存,命名为C/C++.sublime-build,名字C/C++你随便起,但是后缀名和保存路径不要改,默认就行

    该配置文件会保存在/Users/用户名/Library/Application Support/Sublime Text 3/Packages/User

  • 然后现在可以写c/c++的代码了,写完之后,点击Tools->Build System->C:C++

    注意,因为我刚刚保存的时候文件名是C/C++,其中的/被自动替换成:了,所有C:C++也就是我刚刚保存的配置文件

  • 选择完编译器之后,按Command+B, 然后选择C:C++ - Run即可运行,下次直接按Command+B就可以运行了

模拟评测姬

举个例子:

给定一个自然数n (n<=50000),求解1+2+3+…+n的和

test1.cpp 需要检验正确性的程序

test2.cpp 暴力程序

data.cpp 数据生成程序

compare.cpp 比较程序

这个题,我们暴力写的程序test2.cpp就是暴力跑1到n的和,用longlong计算

需要检验的程序test1.cpp就写n * (n + 1) / 2,但是用的是int的变量

可以看出n稍大一些的时候就会爆int

在桌面建一个文件夹,写出下面四个程序,都放在该文件夹里面

test1.cpp

#include<iostream>
using namespace std;
typedef long long ll;
//不开longlong见祖宗!

int main(){
    freopen("test.in","r",stdin);
    freopen("test1.out","w",stdout);
		int n;
    cin>>n;
    cout<<n * (n + 1) / 2<<endl;
    return 0;
}

需要注意的是这里面freopen写的是对应的test1的in和out,别写差批了

test2.cpp

#include<iostream>
using namespace std;
typedef long long ll;
//不开longlong见祖宗!

int main(){
    freopen("test.in","r",stdin);
    freopen("test2.out","w",stdout);
		int n;
    ll sum = 0;
    cin>>n;
	  for(int i = 1; i <= n; ++i)sum += i;
  	cout<<sum<<endl;
    return 0;
}

compare.cpp

#include<cstdio>
#include<cstdlib>
#include<iostream>

int main()
{
    int tmp=0;
    for(int i=1;i<=10000;i++)
    {
        system("./data");
        system("./test1");
        system("./test2");

        // if(i/100>tmp) {printf("-- %d --\n",i);tmp=i/100;}
        if(system("diff test1.out test2.out"))
        {
            printf("wrong in --> %d \n",i);
            break;
        }
        printf("process %d is correct\n",i);
    }
    return 0;
}


data.cpp

#include<iostream>
using namespace std;

int main()
{
    freopen("test.in","w",stdout);
    srand(time(0));
    int a = rand() % 100000;
    cout<<a<<endl;
    return 0;
}

每个程序写完了以后都需要进行编译,生成一个可执行文件,Sublime Text会直接生成在原程序的旁边

搞完以后就是这样的

在这里插入图片描述

现在还需要我们使用MAC自带的终端,command + 空格直接唤出即可

#简单了解一点可能会用到的linux命令
pwd #表示当前在哪个目录下,也就是路径
cd ... #表示进入...的目录
./compare #运行compare程序
control + c # 停止运行

我们打开终端以后需要进入到对拍的文件夹下,第一个方法就是打开文件夹,把文件夹的名字拖到终端去,就能显示文件夹的路径,使用cd命令就能进入,或者就是下载一个超级右键的app,右键文件夹就可以有一个“进入终端”的命令,点击就送

输入./compare后就会开始对拍,找到错误后就会像下面一样

如果一直跑不出来想停下来的话就用control + c

img

运行后的数据会放在test.cpp中,可以直接看的

大体上就是这样,详细的步骤我可能会抽时间录一下放B站上,暂时先咕了

 

博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇