- 建议
- 2009-02-13 13:23:12 @
vijos 的评测方式事实上也是文件测评,使用的是这样的命令行测评:(shell cmd)" p1000.exe out.txt " 然后程序“屏幕”输出的就会进入文件流"out.txt"文件中。但是这样做有一个极大的弊端,就是命令行下这样的文件流操作是不稳定的,尤其是同时有输入和输出的时候。
当输入文件超过一定大小时,会导致输入流崩溃,所以 vj 无法测试大数据,而大数据往往是一道题的精华所在。
当选手程序边读边输的时候,输出流中往往会掺入输入流中的个别字符,导致本来对了的 out 被 compare 判了错。有时候要输出的比较多,没办法存下来再一起输出,这就比较麻烦了。
有的输入数据存不下来,有的人会采取多次读输入数据的情况,vj 同样不支持。
有没有解决办法呢? vj 最初不采用标准文件输入输出测评的原因就是怕选手程序恶意改写系统文件,恶意写巨大文件占用磁盘空间。其实这是有解决办法的。附中的 admin 们应该知道我是谁,实在不想改后台代码我来帮你们改吧。
方法一:增加一个 vijos 专用输入输出函数库,放在 compiler 目录中,其中含 openinputfile; openoutputfile; closeinputfile; closeoutputfile; 等不带参的函数(过程),这样程序写哪个文件读哪个文件就不是选手程序来控制了。只要各位提交的时候加以两行代码即可。
方法二:我们可以让选手程序运行在 sandboxie 中,运行完了之后清除一边 sandboxie 即可,由于最近评测机们给选手程序的帐户权限降低,所以选手程序无法取消 sandboxie 对其的 api hook, 所以选手程序无法破解 sandboxie ,在每次清除 sandboxie 后选手程序的所作所为全部会消失,此方法是防止评测机被黑(poor puppy!) 保障评测机安全的通解!(推荐)
1 条评论
-
hanxiaobou LV 7 @ 2009-01-31 15:03:01
我看不出来
我第一次得十分的原因是我认为休眠的细胞只要周围有两个或三个细胞就可以复活,属于题目看错。
我看楼主你num()函数调用次数太多而且太繁,建议你用temp先储存num函数的结果。还有这句“if t1and((num(i,k)=3)or(num(i,k)=2)) then t2:=true;”是废话,你去掉试试?
- 1