一個很逗的東西——Jd

這個嘛是本人專門爲了NOI上面對拍程序寫的對拍程序,已經經歷了NOI2015的考驗;更重要的是——純Pascal的哦(HansBug:實際上是我不會寫.sh腳本TT,誰叫用慣了windows的我只會寫bat呢)。。。(本人實測複雜度約爲 \( {10}^{5} \) 的程序在windows下每秒鐘約能夠拍20次左右,linux下能夠最高達到600次每秒哦,上次我開動程序後當我反應過來以後次數已是四位數了麼麼噠,固然了若是你程序自己就複雜度太高的話那麼仍是沒有辦法,畢竟受到程序運行速度的制約)。。。linux

 

須要的可執行文件(注:linux下面可執行文件無.exe後綴,在程序中去掉便可,這三個可執行文件均須要文件輸入輸出,其中std程序輸出文件爲stdXXX.out,數據生成器輸出到XXX.in,固然了歡迎擅長使用輸入輸出管道的童鞋進行優化嘍):windows

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

2.stdXXX.exe/stdXXX——你的標程(其實也能夠是暴力程序,總之保證這個必定不WA就好了)  函數

3.fuckXXX.exe/fuckXXX——你的數據生成器(其實這個逗比的前綴前幾天才被JYY狠狠地吐槽了一下,不過我已經用這種對拍格式一年多了,因而這個程序仍是先按照我本身的習慣來設計的啦,歡迎你們按照本身的習慣來進行修改^_^)性能

 

而後在Linux下直接編譯號後開終端直接用就好啦^_^優化

此程序本人將其命名爲Jd。。。。但願即便此程序被傳開以後,Jd這個專有名詞依然能夠保留下去啦this

 

代碼以下:(Jd.exe(Win)/Jd(Linux))spa

 

 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)的輸入輸出管道並且調用起來麻煩;code

2.然而更重要的一點是——這個Fc模塊能夠按照你的需求很是自由的修改(本程序中的是忽略行末空格和多餘回車的,也就是經常使用的模式),好比說容許0.01%的實數精度偏差,那樣子只要簡單修改下fc模塊代碼便可正常使用,並且在程序其餘的地方也能夠按照你本身的須要自由的增刪功能,好比自動計算當前拍下來全部的點裏面的正確率、平均耗時。。。

或者能夠這麼說——這個東西是Pascal寫的(固然了歡迎你們作出來C/C++版的高級語言對拍器),這個是你做爲一個OI黨再熟悉不過的語言了,因此能夠這麼說,在這個裏面只要你想要的功能均可以有,只要你能編出來(HansBug:更況且計算平均值這種東西我想對於已經須要大量對拍的Oier來講恐怕都不是問題吧^_^)

 

最後,歡迎各位優化(HansBug:其實按照JYY的說法,最好是在不很影響性能的狀況下壓縮代碼長度,固然了Linux下每秒鐘500+次的高速度仍是但願保持的啦,然而在win下因爲win自己建立子進程的速度就慢的很因此並非頗有辦法TT,還有弱弱的說一句但願能保留我這個Jd的名字啦麼麼噠^_^)

相關文章
相關標籤/搜索