Create grader.sh

This commit is contained in:
Anthony Wang 2020-03-17 10:21:10 -05:00 committed by GitHub
parent 97ebf7dbc3
commit 926c481795
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

113
Tools/grader.sh Normal file
View file

@ -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