Package: acmhelper
AcmHelper本地环境下的 Polygon , 但不止于 Polygon.你可以快速创建具有合理结构的题目文件夹指定std,checker,validator,interactor使用不同语言完成不同部分 (cpp/py)使用额外的程序来测试数据的质量使用预制的数据生成器快速生成具有某些特征的数据同时使用多种数据生成器 , 并可以指定每个程序所接受的生成器享受由rich,typer带来的美丽TODO使helper sys run可以执行save下的数据添加对Validator和Interactor的支持根据hash动态选择是否编译简易使用说明得益于typer, 关于题目生成的功能都可以通过输入helper --help大致了解安装pip install acmhelper你需要具有全局的g++, 默认使用-std=c++17编译, 可在设置修改快速从数据文件得到渲染的图如果想要使用图的渲染功能 , 你需要下载 Graphviz 的二进制文件并且将其加入 Path对于形式为n m (optional)
u1 v1 w1 (w1 is optional)
...
un vn wn的数据 , 可以使用helper render来快速渲染首先创建文件test.in, 写入一个不连通的DAG5 2
1 2 3
1 3 5
1 5 -7在该文件目录下输入helper render -dic test.in查看test.png, 应该如下所示具体的设置请使用helper render --help查看创建一道题目(以 "输出一个绝对值小于输入数字绝对值的整数"为例(int范围内))首先新建文件夹Problem, 然后在此文件夹下打开命令行 , 输入helper sys init, 回答问题 , 完成初始化如果初始化正确的话你的目录结构应该向下面的一样(部分文件可能没有 , 这需要我们后续手动创建)题目目录结构
- Problem
    - config.json
    - std.cpp/py
    - testlib.h (optional)
    - checker.cpp/py (optional with "testlib.h")
    - interactor.cpp (optional with "testlib.h") (Not implemented)
    - validator.cpp (optional with "testlib.h") (Not implemented)
    - generator
        - make1.cpp
        - make2.py
    - accept
        - ac1.cpp
        - ac2.py
    - wrong
        - wa1.cpp
        - wa2.py
    - exec
        - something executable...
    - data
        - auto
            - in
                - 1.make1.in
                - 2.make2.in
            - out
                - 1.ac1.out
                - 1.wa1.out
        - save
            - in
                - 1.make1.in
                - 2.make2.in
            - out
                - 1.ac1.out
                - 1.wa1.out
    - log
        - 20220303.log
    - temp
        - someting temporary...
    - output
        - something...然后打开std.cpp, 写入以下代码#include<bits/stdc++.h>usingnamespacestd;intmain(){inta;cin>>a;cout<<abs(a)/2<<'\n';return0;}保存后 , 我们来写第一个数据生成器make1.py, 它只用来生成大于0的数.在generator下创建文件make1.py, 写入以下代码fromrandomimportrandintprint(randint(1,1000))接下来只需要修改一些配置 , 就可以通过CLI来生成数据了打开文件config.json, 将如下代码复制{"gen_list":["make1"],"accept_list":[],"wrong_list":[],"gen_link_code":{"make1":["std"]},"gen_data_num":{"make1":10},"time_limit":2,"max_time_limit":10,"std":"std","checker":"checker","interactor":"","validator":"","gcc_version"17}这个文件描述的含义是 , 有一个生成器make1, 其生成 10 组数据 , 生成的数据被用来运行std, 没有额外的理论错误和理论正确的代码 ,Time_Limit_Exceed的上界是2s, 程序被 kill 掉的上界是10s, std 的辨识名称为std, checker 的辨识名称为checker, 没有使用interactor和validator, 使用-std=c++17编译保存后 , 输入helper sys run, 你应该能看到我们暂时性的成功接下来 , 我们来添加额外的生成器,测试代码和checker来完善这道题在wrong下创建wa1.cpp和wa2.py, 然后写入下述代码#include<bits/stdc++.h>usingnamespacestd;intmain(){inta;cin>>a;cout<<a-1<<'\n';return0;}n=int(input())print(n+1)在accept下创建ac1.cpp写入如下代码#include<bits/stdc++.h>usingnamespacestd;intmain(){inta;cin>>a;if(a>=0){cout<<a-1<<'\n';}else{cout<<a+1<<'\n';}return0;}可以发现 ,wrong下的两个代码分别会在a<0和a>0时出错 , 所以我们再新建一个生成器在generator下创建make2.py写入如下代码 , 注意负号fromrandomimportrandintprint(-randint(1,1000))可以发现这道题需要checker, 打开checker.cpp, 写入如下代码#include<bits/stdc++.h>#include"testlib.h"usingnamespacestd;intmain(intargc,char**argv){registerTestlibCmd(argc,argv);// Requiredintn=inf.readInt();intm=ouf.readInt();if(abs(m)<abs(n)){quitf(_ok,"Correct!");}else{quitf(_wa,"Wrong Answer!");}}最后我们再修改一下config.json{"gen_list":["make1","make2"],"accept_list":["ac1"],"wrong_list":["wa1","wa2"],"gen_link_code":{"make1":["std","ac1","wa1","wa2"],"make2":["std","ac1","wa1","wa2"]},"gen_data_num":{"make1":10,"make2":10},"time_limit":2,"max_time_limit":10,"std":"std","checker":"checker","interactor":"","validator":"","gcc_version":17}最后输入helper sys run, 完成了.如果字体和终端合适 , 你应该会看到像这样的东西不出意料地 , 两个不对的程序在合适的地方不对了.作为结尾 , 我们来使用CLI打包数据以及checker输入helper sys add 1 2 3 4 5 6 7 8 9 10, 这样我们就将前10组输入数据和std的输出数据从auto移动到了save下 , 值得注意的是 , 数据的编号会自动地递增 , 所以不用担心数据覆盖问题然后输入helper sys output checker.cc, 查看output文件夹下 , 你应该可以看到名为data.zip的文件 , 其中的所有文件都被合适的重命名了 , 特殊的 ,checker被重命名为了checker.cc更细节的使用请参考helper sys --help,helper sys add --help等