一个很逗的东西——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的名字啦么么哒^_^)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python测试开发django-83.Dockerfile部署django项目
- python测试开发django-82.线上部署设置DEBUG=FALSE
- BCEL ClassLoader去哪了
- python接口自动化35-r.html.render() 下载无反应问题解决
- 源码编译搭建Spark3.x环境
- 搭建Hive3.x并整合MySQL8.x存储元数据
- MySQL binlog_error_action分析
- docker(数据卷容器)
- Python炫技操作:模块重载的五种方法
- 一文搞定 Eureka 集群高可用配置
- SpringBoot三招组合拳,手把手教你打出优雅的后端接口
- 在bootstrap中col-md-offset-* 偏移不起作用
- ES6 模糊查询 智能联想(不区分大小写)
- 干货分享 | K8s 、Docker 常用命令汇总
- 干货 | YOLOV5 训练自动驾驶数据集,并转Tensorrt,收藏!