ACM/OI 出题用
之前出题,很苦恼出数据和检查程序,因为很多繁琐的工作,还很可能小手一抖出问题。
最近又在出题。。。想起之前的对拍脚本,感觉不能更方便,于是撸了一套出题用的小工具,也学习了一点点的DOS命令
首先是输入数据,需要十组,命名规则为01.in,02.in,……,10.in,写好数据生成器rand.cpp后去掉输出重定向然后编译,运行以下脚本
@echo off
set a=
:loop
set /a a=%a%+
rand.exe>%a%.in
echo %a%
ping -n 127.0.0.1>nul
if %a% == goto NEXT
goto loop
:NEXT
set /a a=%a%+
rand.exe>%a%.in
echo %a%
pause
in_maker
@符号表示不把指令显示出来,echo off表示不输出提示
这里学到一个小技巧,dos命令里(貌似)没有sleep命令,于是通过ping来代替,因为每次ping会等待1s,所以需要sleep多少秒就ping多少次(加一)就行,这里因为数据生成器使用时间初始化随机种子,所以需要间隔一秒,所以ping两次
这里第一次接触set操作和变量,具体的以后再研究,这里的变量是 %variable% (注意格式,和for的变量区分)。
这里用到了输出指向>,当然,接下来的out_maker用到了输入指向<
---------------------------------------------------------------------------------------------------------------------------
接下来是输出,命名规则为01.out,02.out,……,10.out,写好标程std.cpp后去掉输入输出重定向,运行以下脚本
@echo off
set a=
:loop
set /a a=%a%+
std.exe<%a%.in>%a%.out
echo %a%
if %a% == goto NEXT
goto loop
:NEXT
set /a a=%a%+
std.exe<%a%.in>%a%.out
echo %a%
pause
out_maker
--------------------------------------------------------------------------------------------------------------------------------
如果确定rand.cpp和std.cpp都没有问题,其实可以写在一起,在in的最后一行,加上call out_maker.bat即可,以后就可以自动化生成数据
@echo off
set a=
:loop
set /a a=%a%+
rand.exe>%a%.in
echo %a%
ping -n 127.0.0.1>nul
if %a% == goto NEXT
goto loop
:NEXT
set /a a=%a%+
rand.exe>%a%.in
echo %a%
call out_maker.bat
pause
data_maker
------------------------------------------------------------------------------------------------------------------------------
然后就是对拍啊,不敢保证自己的标程是对的,要找小伙伴写代码来测试数据,拿到他的代码my.cpp后去掉输入输出重定向编译,然后运行以下脚本
@echo off
set a=
:loop
set /a a=%a%+
my.exe<%a%.in>std%a%.out
fc std%a%.out %a%.out
if errorlevel goto dif
if errorlevel goto sam
:dif
del std%a%.out
echo %a%
pause
if %a% == goto NEXT
goto loop
:sam
del std%a%.out
echo %a%
if %a% == goto NEXT
goto loop :NEXT
set /a a=%a%+
my.exe<%a%.in>std%a%.out
fc std%a%.out %a%.out
del std%a%.out
echo %a%
pause
checker_goto
之前的代码已经可以解决问题了,但是使用goto的话有两个弊病,一是破坏程序结构,使逻辑混乱,二是为了保持结构,有很多重复代码出现,为了解决这个问题,使用for语句和if语句
@echo off
for /l %%a in (,,) do (
if %%a == (
my.exe<%%a.in>std%%a.out
fc std%%a.out %%a.out
del std%%a.out
echo %%a
) else (
my.exe<%%a.in>std%%a.out
fc std%%a.out %%a.out
if errorlevel (
del std%%a.out
echo %%a
pause
) else (
del std%%a.out
echo %%a
)
)
)
pause
这里需要注意的就是,dos命令是格式敏感的if-else必须写成这个格式(注意其中的空格),for循环有很多写法,通过参数区分,这里只使用了/L的,是从1每次加1到10为止。
for中使用的变量是&&variable(区分于set的变量)
到这里,功能实现了,代码也很优美了。
ACM/OI 出题用的更多相关文章
- ACM&OI 基础数论算法专题
ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...
- ACM&OI 基础数学算法专题
[前言] 本人学习了一定时间的算法,主要精力都花在数学类的算法上面 而数学类的算法中,本人的大部分精力也花费在了数论算法上 此类算法相对抽象,证明过程比较复杂 网络上的博客有写得非常好的,但也有写得不 ...
- 组合数学 - 置换群的幂运算 --- poj CARDS (洗牌机)
CARDS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1448 Accepted: 773 Description ...
- [日常] HEOI 2019 退役记
HEOI 2019 退役记 先开坑 坐等AFO 啥时候想起来就更一点(咕咕咕) Day 0 早上打了个LCT, 打完一遍过编译一遍AC...(看来不考这玩意了) 然后进行了一些精神文明建设活动奶了一口 ...
- 喵哈哈村的魔法考试 Round #6 (Div.3) 题解
有任何问题 直接联系QQ:475517977 喵哈哈村的代码传说 第一章 冒泡排序 第一题就是排序嘛,在ACM/OI竞赛中,我只推崇一种排序方法,就是直接调用algorithm里面的sort函数. # ...
- 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本
我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库:PiperLiu / ACMOI_Journey,记录自己的刷题轨迹,并总结一下方法.心得.想到一个需求 ...
- 开源百宝箱《HelloGitHub》第 64 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. HelloGitHub 有实战.教程.黑科技.开源书籍.企业级开源项目,涵盖多种编程 ...
- 收集一些关于OI/ACM的奇怪的东西……
一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * ...
- ACM、OI等比赛中的程序对拍问题
多年前请教于ZXYTIM(zxy)大牛,现在把windows环境下的版本贴出来. 手动数据调试效率太低,程序对拍还是非常实用的,特别适用于OI.蓝桥杯等这些比赛规则.可以用于暴力与AC算法之间的对拍. ...
随机推荐
- Html Ajax上传文件,form表单下载文件
Html中的代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...
- 使用Scanner获取键盘输入 (转)
原文地址:https://www.cnblogs.com/SzBlog/p/5404335.html 后面有改动 使用Scanner类可以很方便地便获取用户的键盘输入,Scanner是一个基于正则表达 ...
- java是值传递,还是引用传递?
原文地址:http://blog.csdn.net/zxmzfbdc/article/details/5401960 java到底是值传递,还是引用传递?以前国内的java开发者有过很多争论,由于& ...
- c# 异步任务队列(可选是否使用单线程执行任务,以及自动取消任务)
使用demo,(.net framework 4.0 自行添加async wait 扩展库) class Program { static void Main(string[] args) { Con ...
- 完整安装sqlserver always on集群
准备工作 1. 四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...
- CV/PR:模式识别与图像处理笔试题
汉王高级研究人员(模式识别.图像处理类)招聘试题 原文链接:http://www.cnblogs.com/dongsheng/articles/2793142.html 说明: 可能您的专业并不完 ...
- 如何构建和设计以确保 API 的安全性
如何构建和设计以确保 API 的安全性 面对常见的OWASP十大威胁.未经授权的访问.拒绝服务攻击.以及窃取机密数据等类型的攻击,企业需要使用通用的安全框架,来保护其REST API,并保证良好的用户 ...
- vc++如何创建程序-设置断点-函数的覆盖,c++的多态性
---恢复内容开始--- 如何设置断点小笔记 将光标移动到你想设置断点的地方,按一下F9键即可,或者你可以用鼠标左键点击小手图标. CommentOut多行注释 函数的覆盖是在父类与子类之间的,函数的 ...
- JS 从36个数字里面随机抽取8个
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 执行opatch apply 报错 OPatch failed with error code 73
.执行opatch apply 报错 OPatch failed [oracle@ora_11g 14275605]$ /opt/oracle/product/db_1/OPatch/opatch a ...