- 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
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 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