Live2D

「工具分享」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
posted @   Rainybunny  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 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
点击右上角即可分享
微信分享提示