OJ题目测试数据生成方法

转载 2013年12月04日 20:33:39

IMUSTOJ运维——批量自动化生成题目测试数据


关于IMUSTOJ

我们使用的OJ是基于NOJ修改而成,根据实际需求进行了一些定制,总体功能修改的很少,所以本文提供的脚本对于使用NOJ的学校也同样适用。

为什么要使用脚本运维

添加题目时,测试数据测生成是一件很麻烦的事情,每道题都需要历经编写标程、编写输入数据、编译、链接、运行,直至输出结果并重定向到文件中,最后还要按照OJ的文件夹组织形式,将输入、输出数据放置到相应文件夹中。如果手工来对每道题进行如上操作,那任务量是非常大的,而且操作及其繁琐,这时就需要用自动化的脚本来帮助我们完成以上工作。

本文脚本实现的功能

  • 给定题目序号范围,自动生成相应的标程及输入数据文件模板,供用户直接更改,而不用手工创建;
  • 自动编译、链接标程,而后使用输入数据运行标程,并将结果重定向到相应目录结构中;
  • 对于编译、链接过程中出错的标程,会有详细的日志记录;

脚本运行截图


脚本实现

首先是自动生成标程和输入数据的模板脚本:

    
    @echo off  
      
    set STARTINDEX=1100  
    set ENDINDEX=1120  
    set STEPINDEX=1  
    set SOURCEDIR=D:\infiles  
      
    if exist %SOURCEDIR% goto direxist >nul 2>nul  
    mkdir %SOURCEDIR% >nul 2>nul  
    :direxist  
      
    FOR /L %%i IN (%STARTINDEX%,%STEPINDEX%,%ENDINDEX%) DO echo TODO > %SOURCEDIR%\%%i.cpp && echo TODO > %SOURCEDIR%\%%i.in  
      
    pause 
 
上述程序根据STARTINDEX和ENDINDEX作为题目序号的起始及结束,生成以题号命名的XXX.cpp和XXX.in模板,供用户进行编辑。输出至SOURCEDIR变量所指定的目录。由于C语言可以不经修改的使用.cpp后缀进行编译,所以这里将所有标程都制定为C++源文件。

接下来是编译、链接、运行程序,这里分为两个脚本:maketest.bat和makeeach.bat

其中,maketest.bat用户枚举标程,而makeeach.bat用于实际处理每个标程。

下面先来查看maketest.bat的源码:

    
@echo off  
      
    set SOURCEDIR=D:\infiles  
      
    for /f "delims=" %%I in ('dir /B /ON %SOURCEDIR%') do call makeeach.bat %SOURCEDIR%\%%~nI %%~nI  
      
    pause  


脚本枚举SOURCEDIR变量所指定的文件夹中的文件,将题号提取出来并传递给makeeach.bat进行进一步处理。

下面我们来查看makeeach.bat的源码:

    
@echo off  
      
    set GPPPATH=E:\IMUSTJudge\AcmJudge\bin\gcc\bin\g++.exe  
    set OUTPUTBIN=D:\outfiles\%2.exe  
    set LOGFILE=D:\maketest.log  
    set OUTPUTDIR=D:\outfiles  
      
    set SOURCEFILE=%1.cpp  
    set INFILE=%1.in  
    set OUTFILE=%OUTPUTDIR%\%2\output\%2.out  
      
    if exist %OUTPUTDIR% goto direxist >nul 2>nul  
    mkdir %OUTPUTDIR% >nul 2>nul  
    :direxist  
      
    del /f /q /s %OUTPUTBIN% >nul 2>nul  
      
    %GPPPATH% %SOURCEFILE% -o %OUTPUTBIN% >nul 2>nul  
      
    set err=%errorlevel%  
      
    if "%err%"=="0" goto success  
    goto failure  
      
    :success  
    mkdir %OUTPUTDIR%\%2\output >nul 2>nul  
    %OUTPUTBIN% < %INFILE% > %OUTFILE%  
    set COPYINFILEPATH=%OUTPUTDIR%\%2\input  
    mkdir %OUTPUTDIR%\%2\input >nul 2>nul  
    copy /Y %INFILE% /A  %COPYINFILEPATH% /A >nul 2>nul  
    goto end  
      
    :failure  
    echo compile %SOURCEFILE% failed  
    echo compile %SOURCEFILE% failed >> %LOGFILE%  
      
    :end 
 
这个脚本是三个脚本中最重要的一个脚本,其中:

  • GPPPATH指定了g++编译器的路径;
  • OUTPUTBIN指定了最终编译好的程序存放路径,其命名是“题号.exe”形式;
  • LOGFILE指定了错误日志的存放位置及名称;
  • OUTPUTDIR指定了最终生成的输入和输出文件存放位置,会自动在此文件夹下创建以题号明明的文件夹,并在其中创建inout和output文件夹,同时将输入和输出数据拷贝至相应文件夹;
  • SOURCEFILE指定了标程名称;
  • IINFILE指定了输入数据文件名称;
  • OUTPUTFILE指定了输出文件的路径及名称;

对于涉及到的文件夹,要先判断其是否存在,都则在复制、编译文件的时候会发生错误。

编译标程的代码很简单,如下所示:

%GPPPATH% %SOURCEFILE% -o %OUTPUTBIN% >nul 2>nul  
判断编译是否成功需要对命令的返回值做判断,如下所示:

   
 set err=%errorlevel%  
      
    if "%err%"=="0" goto success  
    goto failure  


编译成功则运行程序,生成输出数据,并将相应文件拷贝至指定目录结构中,如下所示:

   
 :success  
    mkdir %OUTPUTDIR%\%2\output >nul 2>nul  
    %OUTPUTBIN% < %INFILE% > %OUTFILE%  
    set COPYINFILEPATH=%OUTPUTDIR%\%2\input  
    mkdir %OUTPUTDIR%\%2\input >nul 2>nul  
    copy /Y %INFILE% /A  %COPYINFILEPATH% /A >nul 2>nul  
    goto end 
 

若编译失败,则记录错误日志,如下所示:


:failure  
echo compile %SOURCEFILE% failed  
echo compile %SOURCEFILE% failed >> %LOGFILE% 
 

脚本用法

在配置好参数后,首先运行makesourcefile.bat生成标程及输入数据模板,然后完成相应模板;

完成上述操作后,运行maketest.bat,程序将自动完成所有的相关操作,如果出错,将打印错误日志,并记录到文件中,方便用户查看;

最后,将生成的题目文件夹拷贝到OJ对应的目录中即可。



来自:http://blog.csdn.net/mdl13412/article/details/8245699



我的ACM题目测试数据产生方法

到网上搜了下ACM题目产生方法,却没有搜索到有用的资料,那只能自己钻研一下了,下面把钻研出的结果给大家分享一下。 我们知道,ACM的题目对算法要求很高,OJ上而如何评判一个算法的复杂度靠的是测试数据...
  • u013615904
  • u013615904
  • 2015年01月01日 20:29
  • 1209

OJ在线测评系统程序设计与Python实现

典型的在线判题系统有两种 一种是C/S模式,典型代表是PC^2。主要用在省赛,区预赛,国际赛等大型比赛中。官网:http://www.ecs.csus.edu/pc2/另一种是B/S模式,国...
  • lzcnb
  • lzcnb
  • 2016年03月20日 12:11
  • 2229

九度OJ-题目1509:树中两个结点的最低公共祖先的测试数据

  • 2015年06月14日 14:02
  • 709B
  • 下载

我的ACM题目测试数据产生方法

到网上搜了下ACM题目产生方法,却没有搜索到有用的资料,那只能自己钻研一下了,下面把钻研出的结果给大家分享一下。 我们知道,ACM的题目对算法要求很高,OJ上而如何评判一个算法的复杂度靠的是测试数据...
  • u013615904
  • u013615904
  • 2015年01月01日 20:29
  • 1209

IMUSTOJ运维——批量自动化生成题目测试数据

IMUSTOJ运维——批量自动化生成题目测试数据 By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) 关于IMUSTOJ ...
  • MDL13412
  • MDL13412
  • 2012年12月01日 10:24
  • 2606

mysql快速生成百万条测试数据的方法

转自:mysql快速生成百万条测试数据的方法 — 没那么简单的博客 有时候我们需要对大数据进行测试,本地一般没有那么多数据,就需要我们自己生成一些。下面会借助内存表的特点进行生成百万条测试数据。创...
  • oahz4699092zhao
  • oahz4699092zhao
  • 2016年11月25日 10:59
  • 4470

网上论坛生成测试数据方法(抢分利器)

网上论坛生成测试数据方法(抢分利器)
  • roy_88
  • roy_88
  • 2016年05月06日 10:03
  • 2173

基于搜索测试数据生成的多目标方法 笔记

Pareto解集:一般情况下多目标优化问题中的多个目标函数之间是无法比较并且相互之间经常是冲突的,一个目标函数的改进往往以牺牲另外一个目标函数的值为代价的.因此可以看出多目标优化问题往往包含多个解,并...
  • fandoudou123
  • fandoudou123
  • 2015年04月26日 15:20
  • 480

生成大量的测试数据的三种方法,1写sql,2工具plsql,3LoadRunner

性能测试场景之一:  [1]03 临时表里有20W记录,发送ESB  说明:结算后台对完账后,在对账汇总确认菜单中点“确认”按钮,系统会将已清算的数据信息插入资金库的临时表pac_biz_acco...
  • xuerong13
  • xuerong13
  • 2011年11月15日 17:58
  • 693

mysql快速生成百万条测试数据的方法

有时候我们需要对大数据进行测试,本地一般没有那么多数据,就需要我们自己生成一些。下面会借助内存表的特点进行生成百万条测试数据。 创建一个临时内存表, 做数据插入的时候会比较快些 -- 创建...
  • lusijie1
  • lusijie1
  • 2017年11月06日 10:38
  • 178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OJ题目测试数据生成方法
举报原因:
原因补充:

(最多只允许输入30个字)