「工具分享」Checker Script for Linux
以前整的一个 Linux 下对拍程序 qwq.
建一个文件夹, 假设叫 dir, 然后把 checker.sh 扔进去, 顺便 chmod +x checker.sh. 你需要自己设置一下代码里的 CHECKER_PATH, 指向 dir.
然后在 ~/.zshrc 或者 ~/.bashrc 里加一句 alias checker='/path/to/dir/checker.sh', 重启终端就能使用啦.
使用方式: checker <source-code> <standard-code> <generator-code>, 此后与脚本简单交互一下即可. 注意三个程序必须使用标准输入输出, 不开文件.
特性:
-
比较 colorful.
-
隔离运行, 不会在你的工作目录创建任何临时文件.
-
自动编译, 默认编译开关有
-std=c++2a -Ofast, 修改代码之后直接重新运行 checker 就能对拍. -
计数对拍次数, 且会在固定位置实时输出对拍次数, 不会刷屏.
-
找到错误数据后自动终止, 将输入文件移动到
./errdata.in, 并且会弹出警告窗口. -
对拍结束 (找到错误数据或者
Ctrl+C终止), 自动清除dir内的临时文件. 所以不要在这里面放其他东西. -
暂时不支持同时进行多个对拍, 不太会写那种东西. ()
现学现卖的塑料语法啊. (((
#!/bin/bash
#+Rainybunny+#
# @varriables
# $1: your program's source code;
# $2: standard program's source code;
# $3: data generator's source code;
CHECKER_PATH=/home/rainybunny/Studio/Workspace/.checker
CHECKER_NAME="\033[1mchecker\033[0m"
FATAL_ERROR=2
FOUND_ERROR_DATA=1
src=$1
std=$2
gen=$3
function registerChecker() {
printf "$CHECKER_NAME: Collecting files...\n"
if ! cp $src $CHECKER_PATH/src.cpp; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m The source file does not exist.\n"
exit $FATAL_ERROR
fi
if ! cp $std $CHECKER_PATH/std.cpp; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m The source file does not exist.\n"
exit $FATAL_ERROR
fi
if ! cp $gen $CHECKER_PATH/gen.cpp; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m The source file does not exist.\n"
exit $FATAL_ERROR
fi
printf "$CHECKER_NAME: Compiling files...\n"
printf ">> \033[1;32mCompilation information of \`%s'\033[0m <<\n" $src
if ! g++ $CHECKER_PATH/src.cpp -o $CHECKER_PATH/src -std=c++2a -Ofast; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m File compilation failed.\n"
exit $FATAL_ERROR
fi
printf "\n>> \033[1;32mCompilation information of \`%s'\033[0m <<\n" $std
if ! g++ $CHECKER_PATH/std.cpp -o $CHECKER_PATH/std -std=c++2a -Ofast; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m File compilation failed.\n"
exit $FATAL_ERROR
fi
printf "\n>> \033[1;32mCompilation information of \`%s'\033[0m <<\n" $gen
if ! g++ $CHECKER_PATH/gen.cpp -o $CHECKER_PATH/gen -std=c++2a -Ofast; then
printf "$CHECKER_NAME: \33[1;31merror:\033[0m File compilation failed.\n"
exit $FATAL_ERROR
fi
}
function clearTemp() {
printf "\n$CHECKER_NAME: Clearing temporary files...\n"
find $CHECKER_PATH/* | grep -v $CHECKER_PATH/*.sh | xargs rm
printf "$CHECKER_NAME: Exit.\n"
}
function interuptCall() {
printf "\n$CHECKER_NAME: SIGINT recieved."
clearTemp
exit 0
}
registerChecker
printf "\n$CHECKER_NAME: "
read -p "Please enter to start testing..." tmp
trap 'interuptCall' SIGINT
printf "\nStatus:\n\n"
cnt=0
while true; do
$CHECKER_PATH/gen > $CHECKER_PATH/data.in
$CHECKER_PATH/src < $CHECKER_PATH/data.in > $CHECKER_PATH/src.out
$CHECKER_PATH/std < $CHECKER_PATH/data.in > $CHECKER_PATH/std.out
cnt=`expr $cnt + 1`
if diff -w -q $CHECKER_PATH/src.out $CHECKER_PATH/std.out; then
printf "\033[1A\r"
printf "\33[1;32mAccepted\033[0;32m on test\033[1;34m #%d.\033[0m\n" $cnt
else
printf "\33[1;31mWrong Answer\033[0;32m on test\033[1;34m #%d.\033[0m\n" $cnt
cp $CHECKER_PATH/data.in ./errdata.in
notify-send --icon=dialog-warning --urgency=normal "Error data found!" \
"Data has been saved as \`\$PWD/errdata.in\'."
clearTemp
exit $FOUND_ERROR_DATA
fi
done

浙公网安备 33010602011771号