「工具分享」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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-10-14 Solution -「ARC 104D」Multiset Mean
2020-10-14 Solution -「ARC 104C」Fair Elevator