一个很逗的东西——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.

Jd

对了有人问我为啥要手写那么长的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的名字啦么么哒^_^)

时间: 2024-11-13 18:11:40

一个很逗的东西——Jd的相关文章

VBA 一个很神奇的东西

百度经验参考:http://jingyan.baidu.com/article/4ae03de32663953efe9e6b47.html 今天奇迹般的发现了VBA,都怪自己平时使用excle不够多,VBA将excel自动化,减少了许多繁琐.大量重复的工作量,是一个值得好好研究的东西,有了程序语言的基础,我相信我可以很快了解该语言的基本用法,将对工作效率的提升带来显著的效益. 要开始新的工作了,4月11日早上10点将开启新的征途,进入数据分析这个岗位,众多excel功能,众多python脚本需要

第一次作业:假装这里有一个很响亮的标题

---恢复内容开始--- 一.结缘计算机 缘分可以说是一个很奇妙的东西,喜欢一件事物往往从对它的美好幻想开始.相信许多人想到计算机都会将它与玩游戏联系在一起,对于我却不然,在我看来编程是一个创造的过程--这就是我对于计算机最初的美好幻想.试想通过编写一些代码便能够实现自己心中所想,这难道不是一件令人兴奋的事吗?它执行你的指令,完成你的任务,实现你的想法,这在当时是对我非常有吸引力的,于是我第一志愿便填报了计算机专业. 你认为你的条件如何?其实我并不知道这个问题应该如何回答,物质条件?素质方面?条

gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发

一个很奇怪的问题

先来看看我的一段代码: 1 ArrayList<Integer> array = new ArrayList<Integer>(); 2 3 for(int i = 0;i<100;i++){ 4 array.add(i); 5 } 6 for(int i=0;i<array.size();i++){ 7 // array.remove(new Integer(i)); 8 array.remove(i); 9 } 你觉得这样能不能把array里面的东西都删除呢? 输出

Mybatis_reveiw之Mybatis官方的一个很简单的Demo

上学的时候,一个老师讲了个故事,这个故事的大意是,我们有很多种方式去削苹果,第一种方式,使用指甲刀,第二种方式,使用机床,第三种方式,使用手摇的那种削平果小工具.我们当然都能够完成这个简单的需求,但是使用指甲刀削出来的苹果一定比较坑坑洼洼,不够美观,而且可能会让人感觉到有点没啥食欲.使用机床呢?可能会造成大量的浪费,原本一个美观大方的苹果变成了只能啃几口的正方形.第三个,因为是专门为了削苹果皮而设计的,理论上是最合适用来解决削苹果这个问题的解决方案. 一个好的架构,其实要做的事情是非常简单的,除

今天看到一个非常好的东西。希望大家共勉

转载:看到的一个小故事.意义很深! 在一个山谷的禅房里有一位老禅师,他发现自己有一个徒弟非常勤奋,不管是去化缘,还是去厨房洗菜,这个徒弟从早到晚,忙碌不停. 但是这小徒弟内心很挣扎,他的眼圈越来越黑,终于,他忍不住来找师傅. 他对老禅师说:"师傅,我太累,可也没见什么成就,是什么原因呀?" 老禅师沉思了片刻,说:"你把平常化缘的钵拿过来." 小徒弟就把那个钵取来了,老禅师说:"好,把它放在这里吧,你再去给我拿几个核桃过来装满." 小徒弟不知道师傅

我的2015测试之路 ——做一个很有想法的测试

我的2015测试之路 ——做一个很有想法的测试 不记得有多少次了,总是说等什么时候闲了,就回过头看看这一路跋涉.风尘仆仆的自己.可每次都只是想想而已,即使真的闲下来了,却又不太愿意剥开自己的心,怕看了会伤感.又怕看了会觉得失望,可能是我没有成为,当初那个我想要成为的样子吧.是该对自己说一句对不起了.对不起,我深爱的自己! 人们总是在歌谣里哀求时光慢些,不要再让亲人变老了.但它总也是不听话,于是2015年终究是被推进了历史.现在我们只能在回忆和指尖怀念2015了,诚然,2015对我们每个人来说都是

[搬家from qzone] 我不是一个很好的学长,所以毕业前,给学习学妹们写写自己犯的错误吧

本人刚刚毕业,晚上的的时候听mm扯南操上的猥琐男传闻.额.....忍不住蛋碎一地,于是乎想想自己从刚大一走到现在遇到的各种各种,现在还是写下来,算是给学弟学妹以及还没入校的学弟学妹们留点东西吧.算是跟大家扯扯前面有多少坑,努力少掉下去几回,嗯.当然,有的坑,很有可能掉下去就...嗯,我们班目前:一个把自己扔进西湖再也没出来,一个吃了八片药然后被救起来了,劝退一个,挂到退学两个,留级退学一个,留级没退学的还两个.现在想想我还安全的毕业了,还是很欣慰的~ 想必所有人在大一都热血沸腾过,都用好奇的眼光

CSAPP中一个有意思的小东西

回家的效率明显下降了,但是第三章还是快要结束的节奏.今天看到定长数组这里的时候,看到一个好玩的东西.在计算机的底层中,所有对数组的操作都是利用指针来完成的.数组其实也是一个很简单的数据结构,就是把一些最简单的数据类型合并在一段连续的内存区域上,这就是一个复合类型---数组. 学C语言的时候,大家都知道访问数组元素有两种方法,一种是利用数组名加索引的形式,另外一种就是利用指针加上偏移量的形式.在底层中,不管你用什么方式来访问元素,最后多会转化成对指针的操作. 在编写 代码的时候,编译器在编译过程中