Project_Lemon測評系統使用經驗

Project_Lemon使用經驗

  若是您尚未安裝Project_Lemon,那麼請移步http://www.javashuo.com/article/p-kiwfbmzv-ba.html去查閱安裝教程html

  而後咱們就正式開始教程.ios

環境配置

  首先關於編譯器的配置這裏就不囉嗦了,能夠問度娘去c++

  而後爲了方便測評,能夠修改一下編譯命令:正則表達式

  在選項的編譯器下面有一個"高級"按鈕,首先選中g++,而後點進去數組

  而後下面 有一個"參數",複製其中的"編譯器參數",而後在"配置"複選框中新建配置函數

  例如我須要同時打開C++11和O2,那麼測試

  同時一個比較推薦的配置以下:spa

注意一個新的重要事項:若是編譯不經過而顯示"Failed to create temporary file in C:\WINDOWS : Permission Denied"或者是運行時提示什麼.dll什麼.so找不到的話,那麼就把環境變量刪了,編譯命令C++加上-static -static-libgcc -static-libstdc++,C加上-static -static-libgcc,若是不加編譯命令的話程序沒法運行,會告訴你沒有什麼什麼庫,這是大概由於Lemon在Windows10下讀到了一堆環境變量,並且第一條就是在根目錄下的(系統的TEMP和TMP)線程

其中線程數按照你的CPU來,不要開到CPU上限,通常來講普通的CPU雙線程就夠了,8元的CPU請使用單線程,若是線程多了會致使死機(至少校內的老年奔騰死過幾回QWQ)3d

新建比賽

一開始你打開的時候是這樣的

而後若是你如今拿到了一個cdf(也就是別人的考試包),那麼直接點加號而後打開cdf就行了

若是是本身的題目的話,那麼就

 

比賽文件

  首先爲了方便教程,建議本身搞一個考試包,而後本身考一場,而後同步操做模擬

  首先構建比如賽,對於一場新的比賽,就按照文字新建就行了,比賽的全部數據什麼的都會存在一個文件夾內,例如教程使用的文件夾爲4-10,而後文件夾以下:

 

  其中紅色文件就是Project_Lemon所使用的文件,分別爲data測試數據,source源代碼以及test.cdf配置文件

  而後測試數據文件夾下一道題一個文件夾,例如這裏的T3就是

  默認輸入文件爲*x.in,輸出文件爲*x.out,其中x爲序號

  而後配置試題

  首先在控制->自動添加試題中本身添加一下試題

  按照提示統一設置時限

  對於通常的題若是使用標準輸入輸出流的話勾選"標準輸入"和"標準輸出",不然可使用文件輸入輸出,而後填寫文件名。對於題答題和交互題等一下再說

  選擇一下語言和編譯命令,特別注意比較模式最好是忽略空格

 

  而後稍微檢查一會兒任務,查看時限等等

  而後選手文件夾下每一個選手一個文件夾,不須要子文件夾(默認狀況),例以下圖:

  選手文件夾:

   這裏直接放上 ${文件名}.cpp 便可,若是有其餘文件也沒有關係,可是會增長之後考試備份的體積

  而後就能夠開始了

比賽測評

  首先你會發現沒有選手,而後點擊一下刷新

  而後就會有一些選手,而且你能夠點擊一些每一列來查看排名

  而後接下來是測評

  直接點擊測試所有,而後會有一些成績,注意到咱們的第三題是一道交互題,因此咱們如今暫時不測評

  點擊選手能夠看待每題的詳細信息

  而後能夠在控制->導出成績處處處成績,注意在Linux下須要手動填寫後綴名.html,不然會出現沒法導出的狀況。

  Updata:換了個UI,清真多了。

特別的東西

一些奇怪的狀況

  1. 成羣的"運行時錯誤":請檢查您的編譯器的配置以及選擇,特別注意編譯器的32位/64位的區別,Updata:若是您是32位機子而用Dev-Cpp的編譯器的話那麼編譯命令須要加-m32
  2. "文件錯誤":就是IO咕咕了
  3. 卡測評:測評了一個點好久也沒有TLE也沒有繼續評測:Lemon彷佛在超時較小的狀況下會致使重測,而後有時候會無限重測下去,這個時候應該爲選手多開一點時限而後讓其不影響後面的評測
  4. 而後還有注意的是Lemon的內存測評方式受數據大小以及數組大小同時影響,開的數組過大過多可能致使RE,因此寫暴力分類討論須要謹慎。而後若是你的某些不用數組過大,或者是使用pbds而後指針(初始化的)太多了會致使TLE,例如



    就是某個數組開大了的結果
  5.  上面的狀況一樣適用於數據範圍過大致使RE的結果:Lemon最大支持1024MB的測評,可是若是數組太大會RE(不知道爲何),注意這裏數組太大的定義:Lemon測評結果內存儘管和實際數據大小有關,可是若是你的全部數組在一開始大於最大內存的話,它會RE而不是MLE

  6. 待解決:聽說還有一個沒法運行程序的問題,再看一看。問題已解決。大部分狀況下都是由於32位機使用Dev-C++內置的編譯器,可是Dev-C++同時有32bit和64bit的TDM-C++,因此編譯出來默認是64bit的。須要在編譯命令最後加上一個-m32。
  7. 關於棧:Windows直接編譯時開棧,Linux先用ulimit在終端中提早開好棧,而後在終端調用Lemon

子任務

  子任務要求子任務內的測試數據全AC子任務纔會有分

  這個一開始我也沒有看懂,可是後面去UOJ羣內問了一下而後本身實踐了一下本身的題而後就明白了

  首先您的目錄結構應該是   /example/子任務$\$${x}/name$\$${n}.$\$${in,out}  (${}表示這個字符串是個變量),而後例如咱們的題目名字是complex,而後第一層目錄結構以下:

  下一層目錄結構以下(馬賽克的部分與教程無關,是我造數據的一些東西):

  而後若是你嘗試自動添加試題的話就會:

  因此須要首先手動新建一個試題,而後在試題上右鍵而後選定添加多組測試數據:

  而後配置好分值時間內存以後點擊下一步,而後就會讓你寫正則表達式

  正則表達式就像這樣:

  輸入文件格式按照你的data下目錄格式填寫,前面不要帶'/',而後每一欄通常會有兩個須要匹配的地方,第一個是子任務編號,第二個是子任務下的測試數據編號,編號內用方括號括起來,而後新建參數,參數按照正確的正則表達式填寫,例如這裏的意思就是匹配1個或2個({1,2})任意字符(.),目的是匹配子任務和測試數據編號。

  前面的那個勾有什麼用呢?若是咱們直接這麼下一步,而後你就會發現每個測試數據獨立成一個測試點。這顯然不是你想要的。

  前面的勾選了表示這個參數不一樣的測試數據自成一個子任務。若是你勾選了第二個那麼全部文件名爲complex1的測試數據都會在一號子任務內,而你但願的應該是在同一個文件夾內的玩意自成子任務,因而你就能夠選第一把勾。

  效果:

 

交互題和題答題

  交互題就是你的程序動一下而後評測程序動一下這樣子,而題答題就是直接提交答案測評,而後你就能夠手算數據

  題答題直接改一下題目類型就能夠了,而後交互題須要提早爲交互庫寫好交互程序,而後測評,可是目前我尚未找到一種方法可讓Lemon複製交互程序過去......若是您知道請聯繫我......

  而後還有一種東西叫作Special Judge,目前這個也不能和程序發生交互......

  可是能夠對於選手的運行結果特殊處理,例如之前某谷就有一道被封了的題就是根據你的輸出的某種哈希來計算得分的.......

  因此咱們只講Special Judge(SPJ)

Special Judge

  首先你須要一個程序叫作交互程序的東西,它的寫法:

  首先一個正常的C++程序,而後在Special調用它的時候會經過main函數傳入六個參數,傳參方法就是你在main函數後面的括號如此寫: int main(int argc, char *argv[]) ,而後您的程序就會得到6個參數(編譯的時候建議不要加-g選項以避免干擾):

argv[1]:測試數據輸入文件(輸入)
argv[2]:選手輸出文件(輸入)
argv[3]:測試數據輸出文件(輸入)
argv[4]:該測試點滿分分值(輸入)
argv[5]:該測試點選手獲得的分數(輸出)
argv[6]:輸出測試點信息(輸出)

  而後在程序內除了argv[4]直接用atoi(argv[4])轉爲一個整數(得分爲整數)以外的字符串都是文件名,而後直接在freopen、fopen之類函數用就能夠了

  這裏建議使用fopen( FILE *$\$${file_stream_name} = fopen($\$${file_path_name(const char *),$\$${open_mode})  ),在最後 fflush() 一下輸出的流,而後及時用 fclose(${file_stream_name}) 關閉文件,以及配套的fscanf和fprintf(在原函數上在開頭增長一個參數FILE *表示文件流)。由於有時候會由於打開文件數量過多而沒有關閉致使打開文件失敗以及Lemon沒法正常讀取文件

  例以下面的一個程序就是一個沒有實際意義(只是比較整數)而只是一個好玩的SPJ而已:

 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main(int argc, char *argv[]){
 7     int std_score, wrong_score;
 8     FILE *STD_INP = fopen(argv[1], "r");
 9     FILE *PLY_OUT = fopen(argv[2], "r");
10     FILE *STD_OUT = fopen(argv[3], "r");
11     std_score = atoi(argv[4]);
12     FILE *PLY_SCR = fopen(argv[5], "w");
13     FILE *ERR_RES = fopen(argv[6], "w");
14     
15     int n;
16     
17     fscanf(STD_INP, "%d", &n);
18     
19     wrong_score = std_score * 0.3;
20     
21     for(int i = 1; i <= n; i++){
22         long long a, b;
23         fscanf(PLY_OUT, "%lld", &a), fscanf(STD_OUT, "%lld", &b);
24         if(a != b){
25             fprintf(ERR_RES, "Oh, My God! You told me the answer is %lld on line %d but in fact it is %lld. You Will ONLY Get %d!\n", a, i, b, wrong_score);
26             fprintf(PLY_SCR, "%d\n", wrong_score);
27             goto FILE_END;
28         }
29     }
30     
31     fprintf(ERR_RES, "EXCELLENT! You Got Full Marks!\n");
32     fprintf(PLY_SCR, "%d\n", std_score);
33     
34     FILE_END:
35     fflush(PLY_SCR), fflush(ERR_RES);
36     fclose(STD_INP), fclose(PLY_OUT), fclose(STD_OUT), fclose(PLY_SCR), fclose(ERR_RES);
37     return 0;
38 }

  中間用了一個goto是爲了關閉文件。

  而後就是在這裏面修改一下評測方式,框內填可執行文件路徑

  而後正常評測

  而後若是評測出來寫了「無效校驗器」,那麼請檢查IO,若是全都答案錯誤,請留意得分那裏的main傳入的參數直接就是分數

而後目前介紹就到此位置,後續可能會繼續補充,特別是交互器部分

相關文章
相關標籤/搜索