這個嘛是本人專門爲了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.
對了有人問我爲啥要手寫那麼長的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的名字啦麼麼噠^_^)