読者です 読者をやめる 読者になる 読者になる

hogloidのブログ

へなちょこ

ジャッジシェルスクリプト

ジャッジできるサーバーがないときでも、手元にテストデータさえあればWA/TLE/ACを判定してくれるシェルスクリプトを書きました。

テストしたいコードと同じフォルダに以下のスクリプトを書いた hoge.sh 、inフォルダ、 outフォルダ、 tmp フォルダを作って、inフォルダにinput,outフォルダにoutputを入れてください。tmpフォルダにはプログラムの出力が入ります。

MLE/REは判定してくれません。REなら勝手に segmentation fault するので分かると思いますが、その場合は(出力が偶然一致していない限り)WAと判定されます。
TLEに対する打ち切りとかいうのもないです。
また、TimeLimitは秒単位でしかいじれません。また、実行時間が1分を超えるとおかしくなります(経過秒 mod 60しか見ていない)

テストデータは、対応するinput/outputで拡張子までの文字列が同じ場合にのみ対応しています。inputフォルダには関係のないファイルを入れないでください(隠しファイルにも注意)
コンパイルオプションやら、テストデータの拡張子は自由に変えてください。
元は.in,.outになっています。拡張子なしにもできます。
テストケース数が拡張子になってるやつには対応してません。
二重拡張子にもおそらく対応してません。
WA/TLEになるとそこで実行が打ち切られ、テストケースの数とともにWA/TLEとなったことが表示されます。
すべて通るとACと出ます。

Ubuntu12.04で動作しました。
cygwinとかだと動くのかなあ?

#!/bin/bash

g++  ./tmp.cpp -std=c++0x -Wno-sign-compare -O2 -Wno-unused-result -Wall
cd ./in
TIMELIMIT=2
ACCEPT=1
for INPUT in `ls *`
do
	INPUT=`echo $INPUT | cut -d "." -f 1-1`
	
	START=`date '+%S'`
	../a.out <./$INPUT.in >../tmp/$INPUT.out
	END=`date '+%S'`
	
	TIME=`expr $END - $START`
	TIME=`expr $TIME + 60`
	TIME=`expr $TIME % 60`
	if [ $TIME -gt $TIMELIMIT ]
	then
		echo $INPUT"TLE"
		ACCEPT=0
		break
	fi
	
	DIF=`diff ../out/$INPUT.out ../tmp/$INPUT.out`
	if [ -n "$DIF" ]
	then
		echo $INPUT"WA"
		ACCEPT=0
		break
	fi
done

if [ $ACCEPT -eq 1 ]
then
	echo "AC"
fi