专栏首页HansBug's Lab一个很逗的东西——Jd

一个很逗的东西——Jd

这个嘛是本人专门为了NOI上面对拍程序写的对拍程序,已经经历了NOI2015的考验;更重要的是——纯Pascal的哦(HansBug:其实是我不会写.sh脚本TT,谁叫用惯了windows的我只会写bat呢)。。。(本人实测复杂度约为 \( {10}^{5} \) 的程序在windows下每秒钟约可以拍20次左右,linux下可以最高达到600次每秒哦,上次我开动程序后当我反应过来之后次数已经是四位数了么么哒,当然了如果你程序本身就复杂度过高的话那么还是没有办法,毕竟受到程序运行速度的制约)。。。

需要的可执行文件(注:linux下面可执行文件无.exe后缀,在程序中去掉即可,这三个可执行文件均需要文件输入输出,其中std程序输出文件为stdXXX.out,数据生成器输出到XXX.in,当然了欢迎擅长使用输入输出管道的童鞋进行优化喽):

1.XXX.exe/XXX——你的程序  

2.stdXXX.exe/stdXXX——你的标程(其实也可以是暴力程序,总之保证这个一定不WA就行了)  

3.fuckXXX.exe/fuckXXX——你的数据生成器(其实这个逗比的前缀前几天才被JYY狠狠地吐槽了一下,不过我已经用这种对拍格式一年多了,于是这个程序还是先按照我自己的习惯来设计的啦,欢迎大家按照自己的习惯来进行修改^_^)

然后在Linux下直接编译号后开终端直接用就好啦^_^

此程序本人将其命名为Jd。。。。希望即使此程序被传开之后,Jd这个专有名词依然可以保留下去啦

代码如下:(Jd.exe(Win)/Jd(Linux))

 1 Program Jd;
 2 uses dos,sysutils;
 3 const mm=24*60*60;
 4 var
 5         i,j,k,l,m,n:longint;
 6         tit,s1:ansistring;
 7         t1,t2:extended;tt,jj:boolean;
 8 function fc(ss1,ss2:ansistring):boolean;   //标准比对模块,千万注意无论是正常退出还是中断的都必须关闭文件,否则会导致很快报错
 9         var s1,s2:ansistring;f1,f2:text;
10         begin
11                 assign(f1,ss1);reset(f1);
12                 assign(f2,ss2);reset(f2);
13                 while not(eof(f1)) and not(eof(f2)) do  //有效行的比对
14                         begin
15                                 readln(f1,s1);readln(f2,s2);
16                                 s1:=trimright(s1);
17                                 s2:=trimright(s2);
18                                 if s1<>s2 then
19                                         begin
20                                                 close(f1);close(f2);
21                                                 exit(false);
22                                         end;
23                         end;
24                 while not(eof(f1)) do   //多余行的比对
25                         begin
26                                 readln(f1,s1);
27                                 if trimright(s1)<>'' then
28                                         begin
29                                                 close(f1);close(f2);
30                                                 exit(false);
31                                         end;
32                         end;
33                 while not(eof(f2)) do   //多余行的比对
34                         begin
35                                 readln(f2,s2);
36                                 if trimright(s2)<>'' then
37                                         begin
38                                                 close(f1);close(f2);
39                                                 exit(false);
40                                         end;
41                         end;
42                 close(f1);close(f2);exit(true);  
43         end;
44 function judge:boolean;   //总评测模块,可以按照自己的意愿增删功能,也可以完全改成纯测速器,那样子就不需要std了,然后直接返回True即可
45         begin
46                 writeln('Running source...');
47                 t1:=now;exec(tit+'.exe','');t2:=(now-t1)*mm;   //now函数获取的时间单位为Day
48                 writeln(t2:0:3,'s');
49 
50 
51                 writeln('Running std...');   //如果改成测速模式的话可以删除此段
52                 t1:=now;exec('std'+tit+'.exe','');t2:=(now-t1)*mm;
53                 writeln(t2:0:3,'s');
54 
55                 exit(fc('std'+tit+'.out',tit+'.out'));
56         end;
57 begin
58         write('Program Name :');readln(tit);
59         write('How many (0 means unlimited):');readln(l);
60         i:=0;
61         repeat
62                 inc(i);
63                 writeln('Test No.',i);  
64                 exec('fuck'+tit+'.exe','');   //启动数据生成器
65 
66                 repeat
67                         tt:=judge;
68                         if tt then
69                                 writeln('Accept')
70                         else
71                                 begin    //这边是当出现WA时自动暂停询问是否再测一次,当然了你可以按照你的意愿修改功能
72                                         writeln('Wrong Answer');
73                                         write('Continue this point?');
74                                         readln(j);if j<>1 then break;
75                                 end;
76                 until tt;
77                 writeln('---------------------------------------------------');
78                 writeln;
79         until i=l;
80 end.

对了有人问我为啥要手写那么长的Fc模块,原因如下:

1.直接原因——我不擅长使用FC.exe(Linux下的diff)的输入输出管道而且调用起来麻烦;

2.然而更重要的一点是——这个Fc模块可以按照你的需求非常自由的修改(本程序中的是忽略行末空格和多余回车的,也就是常用的模式),比如说允许0.01%的实数精度误差,那样子只要简单修改下fc模块代码即可正常使用,而且在程序其他的地方也可以按照你自己的需要自由的增删功能,比如自动计算当前拍下来所有的点里面的正确率、平均耗时。。。

或者可以这么说——这个东西是Pascal写的(当然了欢迎大家做出来C/C++版的高级语言对拍器),这个是你作为一个OI党再熟悉不过的语言了,所以可以这么说,在这个里面只要你想要的功能都可以有,只要你能编出来(HansBug:更何况计算平均值这种东西我想对于已经需要大量对拍的Oier来说恐怕都不是问题吧^_^)

最后,欢迎各位优化(HansBug:其实按照JYY的说法,最好是在不很影响性能的情况下压缩代码长度,当然了Linux下每秒钟500+次的高速度还是希望保持的啦,然而在win下由于win本身创建子进程的速度就慢的很所以并不是很有办法TT,还有弱弱的说一句希望能保留我这个Jd的名字啦么么哒^_^)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 1593: [Usaco2008 Feb]Hotel 旅馆

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 39...

    HansBug
  • 1012: [JSOI2008]最大数maxnumber

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 443...

    HansBug
  • 2015: [Usaco2010 Feb]Chocolate Giving

    2015: [Usaco2010 Feb]Chocolate Giving Time Limit: 10 Sec  Memory Limit: 162 MB S...

    HansBug
  • 大数据指数基金升级战,浪潮之巅谁与争锋?

    从2013年互联网金融开始兴起以来,除了业务模式开始出现多样化以外,更多的核心发展在于互联网平台上的以大数据为依托的互联网征信技术。本质上而言,现有的互联网金融...

    小莹莹
  • 【2020HBU天梯赛训练】7-53 名人堂与代金券

    对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以...

    韩旭051
  • Quartz.net官方开发指南 第四课:关于Triggers更多内容

    同Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择。 Calendars——日历 ...

    张善友
  • 云调用,小程序鉴权正确姿势

    互联网的应用,大大小小,不同场景,都离不开鉴权,从简单的可被用户感知的登陆鉴权,到技术侧不被感知的各种技术参数鉴权,都有着形形色色的鉴权方式和表现形式。

    腾讯云开发TCB
  • 云调用,小程序鉴权正确姿势

    ? 目录: 一、无处不在的鉴权    1. 现实生活中的身份鉴权方法    2. 简单的密码鉴权体系 二、鉴权优化    1. 频繁的鉴权场景下的优化方案  ...

    腾讯技术工程官方号
  • Android Gradle 设置导出APK的名称

    在 app moudle 中打开 build.gradle 找到配置 android{...}

    剑行者
  • Moziila 文件结构概览(译)

    这个文档是一份为开发人员提供的 Mozilla 源码目录结构树的指南。它提供源码的鸟瞰以方便开发人员理解 Mozilla 里有什么,到哪里去找想要的东西。它对一...

    mzlogin

扫码关注云+社区

领取腾讯云代金券