转发自 http://phdwu.com/2015/04/special-judge-usage-in-hustoj/

 

本文介绍了在流行、开源的ACM Online Judge平台——HUSTOJ上创建Special Judge题目的方法,并以两道题目为例,给出了具体的操作过程。

1 简介

随着ACM/ICPC比赛的不断发展,中国大陆地区已经有越来越多的高校参与到此项赛事中。这里这里可以看到2014年ACM/ICPC中国区六大赛区的参赛情况。

HUSTOJ(Google Code地址Github地址)是一款出色的开源项目,由华中科技大学前ACM队员Sempr等同学开发,2008年5月14日首先上线于华中科技大学,目前已有近百家学校、公司使用HUSTOJ进行计算机程序设计竞赛、计算机程序设计日常教学与测验、人才招聘等。

2 Special Judge

通常的ACM题目包括以下几项内容:题目描述(Description)、输入描述(Input)、输出描述(Output)、样例输入(Sample Input)、样例输出(Sample Out),在后台则包括测试输入(Input Data)和测试输出(Output Data)两项。在评测用户提交的程序正确与否时,系统会将样例输入和测试输入重定向作为程序的标准输入,通过判断程序对应的输出是否与期待的输出完全相同,来判断解答是否正确。

对于同一道题目,用户可能使用各种不同的方法来解答,所以对于某些特殊的题目,其结果可能不唯一,但都符合题目要求。此类题目就需要进行特判(Special Judge)。HUSTOJ便提供了特判功能。

这些题目主要有:
1、答案不唯一。见下例一
2、控制精度。题目要求输出精度在某eps之内。见下例二
3、其他。(欢迎留言补充)

3 Special Judge在HUSTOJ中的使用

主要步骤有:

1、在题目后台编辑页面启用该选项,如图1所示。

图1

2、编制data.indata.outspj.cc(或spj.c)。

3、编译出spj,设执行权限,连同2中的三个文件一起上传至服务器。

例一

下面以UPCOJ中的一道题目为例说明SPJ在HUSTOJ中的使用。
题目版权归原平台、作者所有,本文给出示例并不代表原题目使用同样方法进行评测。

给出一个不小于12的正整数n,请你输出两个合数,使他们的和等于n

分析题意,可以得出系统判断用户输出是否正确的两个条件是:

  1. 输出的两个数是否均为合数;
  2. 输出的两个数之和是否为n

首先分别制定data.in(测试输入)、data.out(测试输出)如下:

filename: data.in
1
2
3
4
3
12
15
1000
filename: data.out
1
2
3
8 4
9 6
500 500

然后编写spj.cc(特判程序)。HUSTOJ中的spj.cc需要有3个文件名参数传入:测试输入、测试输出、用户输出。
spj的返回值决定着判断结果,成功返回(0)表示AC,其他非零值表示WA。
下面给出一个本题spj.cc的示例代码。

filename: spj.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
bool is_prime(int x)//判断素数,伪代码
{
if(x是素数)
return true;
else
return false;
}
int main(int argc,char *args[])//主函数
{
FILE * f_in=fopen(args[1],“r”);//测试输入
FILE * f_out=fopen(args[2],“r”);//测试输出
FILE * f_user=fopen(args[3],“r”);//用户输出
int ret=0;//返回值
int T,n,a,b;
fscanf(f_in,“%d”,&T);//从输入中读取数据组数T
while(T–)
{
fscanf(f_in,“%d”,&n);
fscanf(f_user,“%d%d”,&a,&b);
if(a+b!=n || is_prime(a) || is_prime(b))
ret = 1;//Wrong Answer
}
fclose(f_in);
fclose(f_out);
fclose(f_user);
return ret;
}

编制完spj.cc后,将这些文件上传至服务器。

登录服务器以后进入/home/judge/data/[题号]文件夹,执行以下操作:

/home/judge/data/1000
1
2
3
acm@acm:/home/judge/data/1000$ sudo vim spj.cc #Edit the file spj.cc
acm@acm:/home/judge/data/1000$ sudo g++ -o spj spj.cc # gcc -o spj spj.c
acm@acm:/home/judge/data/1000$ sudo chmod +x spj

测试:

/home/judge/data/1000
1
2
3
4
5
6
acm@acm:/home/judge/data/1000$ ./spj data.in data.out data.out
acm@acm:/home/judge/data/1000$ echo $?
0 #Accepted
acm@acm:/home/judge/data/1000$ ./spj data.in data.out data.in
acm@acm:/home/judge/data/1000$ echo $?
1 #Wrong Answer

在本地HUSTOJ测试,通过网页提交,通过。

例二

某题目要求经过一定复杂计算后输出一个实数结果,精度要求控制在104内。
分析题意,可知spj需要判断测试输出a与用户输出x之差是否在eps之内。
spj.cc 如下:

filename: spj.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
const double eps = 1e-4;
int main(int argc,char *args[])//主函数
{
FILE * f_in=fopen(args[1],“r”);//测试输入
FILE * f_out=fopen(args[2],“r”);//测试输出
FILE * f_user=fopen(args[3],“r”);//用户输出
int ret=0;//返回值
int T;
double a,x;
fscanf(f_in,“%d”,&T);//从输入中读取数据组数T
while(T–)
{
fscanf(f_out,“%lf”,&a);
fscanf(f_user,“%lf”,&x);
if(fabs(a-x)>eps)
ret = 1;//Wrong Answer
}
fclose(f_in);
fclose(f_out);
fclose(f_user);
return ret;
}

如何优雅的停止Java线程?

interrupt

package threadTest;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread a = new Thread(new Worker());
a.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a.interrupt();
}
}
class Worker implements Runnable {
public void run() {
// TODO Auto-generated method stub
try {
while (true) {
System.out.println(new Date());
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println(“Exited!”);
}
}
}

hustoj的用法

  1. 注册codeup.cn,开通校级账号,全网访问。
  2. 自建服务器,物理机虚拟机均可,校园网访问。
  3. 服务器托管学校机房,开通外网端口,外网访问
  4. 使用新浪云挂Web端,内网判题,全网访问。
  5. AWS免费服务器,低速全网访问。
  6. ————备案、收费的分割线————
  7. 廉价VPS,低速全网访问。
  8. 使用阿里云,高速全网访问。
  9. 新浪云挂Web,阿里云挂判题,利用新浪云提供域名及免费流量。
  10. 专用服务器,托管双线机房。

以上方案,从上到下,技术难度递增,成本、费用递增。

深渊

裂缝深不见底,阿呆差点掉下去。史蒂夫说,离那里远一点,下面是虚空,掉下去的话会摔出这个宇宙,你就再也回不来了。

史蒂夫看看表,剩下的时间不多了,我们只能选择造一座桥过这个深渊或者造一间房子来保命。

如果造桥的话,过了深渊可能天已经黑了,我们要赶回村庄还有一段路程,如果遇上僵尸怪,我自己还能保命,但是恐怕你得自己跟紧我。

如果造保命屋的话,你要帮我一起造,这样才能造一个足够我们两人过夜的房子。

选择

  • 造桥
  • 造房子

村庄

来到山坡下的村庄,阿呆才发现,原来山坡上一层层的并不是有意开发的梯田。而是因为这个世界一切皆为方块,山坡上的斜面也都具有马赛克效果,远处看起来就像梯田一样。

村庄里的有各式各样的建筑,商店、酒馆、学校、教堂,当然还有居民楼。史蒂夫说,你想去我家里看看么,还是打算闲逛一下?

选择:

  • 去史蒂夫家
  • 去酒馆

Stickman crossover Minecraft

阿呆是个火柴人,他生活在一个手机游戏中,爱画画的小男孩创造了他。名字叫阿呆,不是因为他呆头笨脑,而是小男孩儿给他画了一个大头两只手和三条腿,样子就是个汉字“呆”。根据程序员编写的指令,小男孩儿的手指头点到哪里,他就要跑到哪里。不管是上刀山还是下火海,他都毫不犹豫。小男孩儿一路上画各种工具、武器帮助他打败各种怪兽和坏蛋,他觉得自己就是小男孩在手机里的代言人。

小男孩的弟弟刚刚一周岁,还不怎么会说话的他也对手机充满了兴趣,只要有机会他就抓起手机像锤子一样砸向地板。砸的次数多了,手机外壳也裂开了,系统也开始出问题了。

地震发生时,呆正坐在熔岩流旁边等着下雨。突然一声巨响,醒过来时他发现四周有点异样。

首先是这草地的颜色,太绿了,绿的不真实。虽然他知道自己就不是一个真实的人物,但这种绿是他这辈子都没有见过的。

其次是空旷,以前他只见过上下左右,这是第一次,他领悟了什么是前后。一种心智开启的感觉从他扁平的二维身躯里泄露出去,手机闹钟响起来,查拉图斯如是说。

最后是光明,天边有个方方的东西及其缓慢的在移动,它发出温暖而柔和的金色光芒,这种感觉就像传说中夕阳的味道。不过呆从来没有见过太阳,他对这个假设不是特别有把握。

就在阿呆发呆的时候,山边梯田那里跑过来一个人。等这人离得近了,阿呆不由得乐了,怎么天底下还有人和我一样,长了一个方脑袋?再仔细一看,真要命,不止是脑袋,鼻子眼睛,嘴巴耳朵,就连身上穿的衣服,都是用一格一格方块拼出来的。

那人冲过来一把揪住阿呆,转身拖着手就走,说道你在这里干什么,天快黑了,想活命快跟我来。

啊!阿呆吓到一屁股坐在地上,这时天上飘过几个方块拼出来的大字“Minecraft”。

大地震动起来,一道裂缝迅速扩大。

选择:

裂缝出现在身后,阿呆和史蒂夫松了一口气迅速前往村庄

裂缝出现在前方,阿呆和史蒂夫面前出现了一道深渊

GoogleCode,我们会想你的。

Bidding farewell to Google Code

Posted: Thursday, March 12, 2015

When we started the Google Code project hosting service in 2006, the world of project hosting was limited. We were worried about reliability and stagnation, so we took action by giving the open source community another option to choose from. Since then, we’ve seen a wide variety of better project hosting services such as GitHub and Bitbucket bloom. Many projects moved away from Google Code to those other systems. To meet developers where they are, we ourselves migrated nearly a thousand of our own open source projects from Google Code to GitHub.

As developers migrated away from Google Code, a growing share of the remaining projects were spam or abuse. Lately, the administrative load has consisted almost exclusively of abuse management. After profiling non-abusive activity on Google Code, it has become clear to us that the service simply isn’t needed anymore.

Beginning today, we have disabled new project creation on Google Code. We will be shutting down the service about 10 months from now on January 25th, 2016. Below, we provide links to migration tools designed to help you move your projects off of Google Code. We will also make ourselves available over the next three months to those projects that need help migrating from Google Code to other hosts.

  • March 12, 2015 – New project creation disabled.
  • August 24, 2015 – The site goes read-only. You can still checkout/view project source, issues, and wikis.
  • January 25, 2016 – The project hosting service is closed. You will be able to download a tarball of project source, issues, and wikis. These tarballs will be available throughout the rest of 2016.

Google will continue to provide Git and Gerrit hosting for certain projects like Android and Chrome. We will also continue maintaining our mirrors of projects like Eclipse, kernel.org and others.

How To Migrate Your Data Off Google Code

The simplest way to migrate off of Google Code is to use the Google Code to GitHub exporter tool, which provides an automated way to migrate a project’s source, issues, and wikis to a new GitHub repo. Please note: GitHub’s importer will convert any Subversion or Mercurial Google Code projects to use Git in the process.

We also offer stand-alone tools for migrating to GitHub and Bitbucket, and SourceForge offers a Google Code project importer service.

If you encounter any problems using these tools, please log issues with us, contact google-code-shutdown@google.com, or email me directly (cdibona@google.com). We’ll also be closely tracking Hacker News, Reddit, and other popular forums to answer questions in public. We know this decision will cause some pain for those of you still using Google Code and we’re sorry for that. We’ll continue to do our best to make the migration process easy for you.

GitHub and Bitbucket are both looking forward to working with developers moving off of Google Code. They’ve been great to work with leading up to this announcement, so we’d like to thank those sites for their continued support of the community. There are some great options for people today that didn’t exist in 2006, and we look forward to helping you find the one that works for your project.

Chris DiBona, Director of Open Source

公安备案号33010402001768