這幾天組織了幾次省選模擬賽,遇到了答案提交類的題目和互動式的題目。我一直使用cena進行評測,現在希望把這兩種型別的題目方便地加入cena的評測結果中。互動式的題目使用cena評測非常簡單,只需要在庫函式執行時輸出乙個以得分情況為內容的檔案作為選手輸出即可(http://www.matrix67.com/blog/article.asp?id=179)。但答案提交類的題目卻遇到了麻煩,因為cena肯定不允許程式訪問外部檔案(因此不能另寫程式讀入提交的答案並作為選手輸出檔案輸出),而每個選手提交的答案檔案所在位置又不確定(不知道資料夾名),不能把這些檔案加入cena的評測中。後來,我想到了這樣乙個解決方案。我可以用程式生成乙個程式來生成選手輸出檔案(真他媽的繞口)。
假設測試點共10個,所有的輸入檔名為name.?.in,輸出檔名為name.?.out,其中?取1到10中的數。那麼下列程式可以生成乙個printer.pas作為選手程式。以下程式將選手提交的答案寫入pas源**「printer.pas」中,它可以根據輸入檔案恰當地進行輸出操作。「printer」將被設定為該題的源程式檔名。
評測時所用的輸入檔案只有乙個整數,標識這是第幾個測試點。程式的輸出(即選手提交的答案)可以和標準輸出比較或另寫checker評分。
program print;
const
fname='name';
vari:integer;
st:string;
procedure init;
begin
writeln('program printer;');
writeln('var n:integer;');
writeln;
writeln('begin');
writeln(' assign(input,'+#39+fname+'.in'+#39+');');
writeln(' reset(input);');
writeln(' readln(n);');
writeln(' close(input);');
writeln(' assign(output,'+#39+fname+'.out'+#39+');');
writeln(' rewrite(output);');
writeln;
end;
begin
assign(output,'printer.pas');
rewrite(output);
init;
for i:=1 to 10 do
begin
str(i,st);
assign(input,'name.'+st+'.out');
reset(input);
if ioresult<>0 then continue;
writeln(' if n=',i,' then begin');
repeat
readln(st);
writeln(' writeln(',#39,st,#39,');');
until eof;
writeln(' end;');
writeln;
end;
writeln(' close(output);');
writeln('end.');
close(output);
end.
採取一些工具軟體可以在不同的選手資料夾下批處理執行該程式。
過幾天我可能又要思考如何評測迴圈賽型別的題目了。
做人要厚道
轉貼請註明出處
外企面試官最愛提的10個問題(附答案)
1.請介紹一下你自己。這是外企常問的問題。一般人回答這個問題過於平常,只說姓名 年齡 愛好 工作經驗,這些在簡歷上都有,其實,外企最希望知道的是求職者能否勝任工作,包括 最強的技能 最深入研究的知識領域 個性中最積極的部分 做過的最成功的事,主要的成就等,這些都可以和學習無關,也可以和學習有關,但要...
外企面試官最愛提的10個問題(附答案)
1.請介紹一下你自己。這是外企常問的問題。一般人回答這個問題過於平常,只說姓名 年齡 愛好 工作經驗,這些在簡歷上都有,其實,外企最希望知道的是求職者能否勝任工作,包括 最強的技能 最深入研究的知識領域 個性中最積極的部分 做過的最成功的事,主要的成就等,這些都可以和學習無關,也可以和學習有關,但要...
提正確的問題,用聰明的辦法解決
剛才我們一起過了一下付費,抱歉,我又非常氣憤。氣憤在於大家的智慧型沒有發揮,而在乙個亂麻中間攪和,完全是在浪費生命。我期望百姓網的程式設計師都是hacker,如下是我的期望 1.要有追求。2.要問正確的問題。問正確的問題比解決問題更重要。今天我看到大家問的問題都是如何在ad上打標籤,如何補乙個有乙個...