以前整的一个 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

「工具分享」Checker Script for Linux的更多相关文章

  1. 「工具推荐」golang 代码可视化工具 go-callvis

    「工具推荐」go-callvis go-callvis是相对 以图片的形式展示了go程序的调用关系,这个工具在看复杂项目时尤其有用. 亲测,借助它看祖传golang代码,头痛好多了. 安装 go ge ...

  2. 「资料分享」理解uboot要看哪些书

    最开始是看的韦东山老师的视频,确实很不错,不过总感觉是不够深入扎实,还是想自己看看书,就总结搜罗下,以供参考 学习交流可以添加 微信读者交流①群 (添加微信:coderAllen) 程序员技术交流①群 ...

  3. 「干货分享」模块化编程和maven配置实践一则

    ​ 封面 说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构: ​ 其中: 基础平台部职责: 1.AI实验室:语音,图像 ...

  4. Linux 小知识翻译 - 「Shell 脚本」

    这次说说「Shell 脚本」. 根据上回的介绍,Shell就是「作为联系Linux和用户的接口而存在的软件」.在Linux环境中,通过Shell来操作系统很普遍. 这里,考虑到有时候可能想要「多次的进 ...

  5. 「工具」三分钟了解一款在线流程绘制工具:Whimsical

    Whimsical 是一款在线流程绘制工具,只需要一个浏览器就随时随地绘制精美的流程图.除了流程图(Flowcharts)功能,官方还推出了线框图(Wireframes).便利贴(Sticky Not ...

  6. [转帖]「日常小记」linux中强大且常用命令:find、grep

    「日常小记」linux中强大且常用命令:find.grep https://zhuanlan.zhihu.com/p/74379265 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍 ...

  7. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  8. iDoc「文档」功能强势升级!一键分享,即刻预览!(201903-1版本更新)

    小摹很想知道小伙伴们在面对众多杂乱的文档时,都是如何管理起来的呢?iDoc的「文档」功能,很多小伙伴还没有用起来,甚至都没有注意到iDoc还有这样一个功能.今天小摹就给大家介绍一下iDoc的「文档」功 ...

  9. Linux 小知识翻译 - 「桌面环境」

    这次聊聊桌面环境. 上次聊了 X Window System 相关的内容,虽然令人意外,但X Window System 和桌面环境不是一回事.请大家稍微考虑一下. X Window System 是 ...

  10. Linux 小知识翻译 - 「架构 续」(arch)

    上次,从「计算机的内部构造」的角度解释了架构这个术语.这次,介绍下架构中经常提到的「i386架构」及之后的「i486」,「i586」. 安装Linux的时候,很多人即使不了解但也会经常听到i386架构 ...

随机推荐

  1. 2023年10月,红米(小米)note 8 pro 优化记

    看了红米的note 13 pro和note 12 turbo的参数和价格后,我决定下单买个note8 pro的手机壳,确实有新手机的感觉了. 我note8 pro手机参数如下 MIUI 12.0.5 ...

  2. NetBox使用教程1-组织架构

    前言 本教程用于学习NetBox的基础使用,练习可使用官方Demo:https://demo.netbox.dev/ NetBox 使用教程系列:https://songxwn.com/tags/ne ...

  3. java——棋牌类游戏五子棋(singlewzq1.0)之二

    package basegame; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Image; import ja ...

  4. 题解:AT_abc382_c [ABC382C] Kaiten Sushi

    题目传送门 思路 首先看一下数据范围. \(1 \leq N, M \leq 2 \times 10^5\) \(1 \leq A_i, B_i \leq 2 \times 10^5\) 这么大的数据 ...

  5. 体验 DORIS 安装

    1.概述 doris 是 百度提供一个MPP架构的分析性数据库. 下面介绍一下如何安装doris . 2.下载 我用的是centos 7.5 的虚拟器. https://doris.apache.or ...

  6. require.js 笔记

    1.前言 随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作.模块复用.单元测试等等一系列 ...

  7. 2023 秋季学期 六周集训 Misc方向

    by 高鹏鸿.密语 写在前面,记录和交流是一个很好的习惯,建议可以自己先搭建一个博客用于存储自己的做题记录以及方便交流.还有,对于Misc方向,灵活应对十分重要,一定要善用搜索引擎. 还有一点,给大家 ...

  8. SQLServer使用STUFF-for xml path实现结果行列转置

    源数据: 场景1: 查出用户的爱好,并进行行列转置 select cname, stuff((select ','+f.favor from tb_favor f where f.userid=b.u ...

  9. IOS中的Context Menu

    IOS中的Context Menu 通过长按组件或者3D touch方式,周边全部虚化,弹出一个可操作的菜单,并且菜单之间也可以嵌套 IOS13之后已经弃用UIViewControllerPrevie ...

  10. 【Python自动化】selenium简单应用

    准备工作 查询浏览器版本 chrome://version/ 下载驱动 https://chromedriver.storage.googleapis.com/index.html 下载的驱动版本要和 ...