diff options
author | Ta180m | 2020-03-17 10:21:10 -0500 |
---|---|---|
committer | GitHub | 2020-03-17 10:21:10 -0500 |
commit | 926c48179598c2e2eb871be7f17adbaf6adb0095 (patch) | |
tree | 08e72147c294bd89bca5466d8652ccdb5b693605 /Tools | |
parent | 97ebf7dbc3b05de49baaca1a543250689efc44d2 (diff) |
Create grader.sh
Diffstat (limited to 'Tools')
-rw-r--r-- | Tools/grader.sh | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/Tools/grader.sh b/Tools/grader.sh new file mode 100644 index 0000000..3fa91c1 --- /dev/null +++ b/Tools/grader.sh @@ -0,0 +1,113 @@ +# use this to grade your program given the input and output files + +IN="$1/#.in" +OUT="$1/#.out" + +TL=2 +CPP="g++ -o .vscode/$1 -O2 -w -lm" # C++, -w = suppress warnings + +red='\x1B[0;31m' +RED='\x1B[1;31m' +GREEN='\x1B[1;32m' +green='\x1B[0;32m' +blue='\x1B[0;34m' +BLUE='\x1B[1;34m' +cyan='\x1B[0;36m' +CYAN='\x1B[1;36m' +NC='\x1B[0m' # No Color + +rm -f .overview .compiler_report .time_info .$1.out +trap "{ rm -f .overview .compiler_report .time_info .$1.out; }" SIGINT SIGTERM EXIT + + +if [ $# -ne 1 ] +then + echo "Usage: $0 source_code" + echo " e.g. $0 test.cpp" + echo " use the above to grade file test.cpp" + exit 2 +fi + +# Language detection +LANG=`echo $1.cpp | awk -F . '{print $NF}'` +if [ "$LANG" == "cpp" ] +then + COMPILER="$CPP $1.cpp 2> .compiler_report" # C++ +fi + +# Compilation +echo -e " ${CYAN}* Compiling source code${NC}"; +echo "$COMPILER" | sh +if [ $? -ne 0 ] +then + echo -e " ${RED}X Compilation Error${NC}"; + cat .compiler_report; + exit 1; +fi + +echo -e " ${GREEN}* Successful compilation!${NC}"; +echo + +ulimit -t $TL; + +rm -rf .overview; +CORRECT=0 +MAX_N=50 + +for (( i=1; i<=$MAX_N; i++)) +do + TEST_CASE_IN=`echo $IN | sed "s/#/$i/g"` + TEST_CASE_OUT=`echo $OUT | sed "s/#/$i/g"` + + # If i-th test case doesn't exist then stop here. + if [ ! -e $TEST_CASE_IN ] + then + break + fi + echo -e "${BLUE}Test case $i:${NC}"; + + time -p (./.vscode/$1 1 < $TEST_CASE_IN > .$1.out) 2> .time_info; + + EX_CODE=$?; + if [ $EX_CODE -eq 152 ] + then + echo -e " ${RED}X TLE: Time Limit Exceeded${NC}"; + echo -n "T" >> .overview; + elif [ $EX_CODE -ne 0 ] + then + echo -e " ${RED}X RE: Runtime Error${NC}"; + echo -n "E" >> .overview; + else + PROG_TIME=`cat .time_info | grep real | cut -d" " -f2`; + diff --strip-trailing-cr .$1.out $TEST_CASE_OUT > /dev/null + if [ $? -eq 0 ] + then + echo -e " ${GREEN}* OK${NC} [$PROG_TIME]" + echo -n "*" >> .overview + CORRECT=`expr $CORRECT + 1` + else + echo -e " ${RED}X WA: Wrong Answer${NC} [$PROG_TIME]" + echo -n "X" >> .overview + fi + fi + + echo; +done +N=`expr $i - 1` + +echo; + +echo >> .overview; +echo -n "Overview: "; cat .overview +if [ $CORRECT -ne $N ] +then + echo -e "${RED}X${NC}: Wrong Answer, ${RED}T${NC}: Time Limit Exceeded, ${RED}E${NC}: Probably runtime error" + echo +fi + +echo -n "$CORRECT / $N" +if [ $CORRECT -eq $N ] +then + echo -en " ${GREEN}AWWW YEAH :D${NC}" +fi +echo |