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传入的参数直接就是分数

而后目前介绍就到此位置,后续可能会继续补充,特别是交互器部分

相关文章
相关标签/搜索