AcmHelper -运行在本地的Acm帮手

AcmHelper

详见github
本地环境下的 Polygon , 但不止于 Polygon.

你可以

  • 快速创建具有合理结构的题目文件夹
  • 指定 std , checker , validator , interactor
  • 使用不同语言完成不同部分 (cpp/py)
  • 使用额外的程序来测试数据的质量
  • 使用预制的数据生成器快速生成具有某些特征的数据
  • 同时使用多种数据生成器 , 并可以指定每个程序所接受的生成器
  • 享受由 rich , typer 带来的美丽

TODO

  • 使 helper sys run 可以执行 save 下的数据
  • 添加对 ValidatorInteractor 的支持
  • 根据 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 , 写入一个不连通的 DAG

5 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>
using namespace std;

int main() {
    int a; 
    cin >> a; 
    cout << abs(a)/2 << '\n'; 
    return 0;
}

保存后 , 我们来写第一个数据生成器 make1.py , 它只用来生成大于 0 的数.

generator 下创建文件 make1.py , 写入以下代码

from random import randint
print(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 , 没有使用 interactorvalidator , 使用 -std=c++17 编译

保存后 , 输入 helper sys run , 你应该能看到我们暂时性的成功

接下来 , 我们来添加额外的生成器,测试代码和 checker 来完善这道题

wrong 下创建 wa1.cppwa2.py , 然后写入下述代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a; 
    cin >> a; 
    cout << a-1 << '\n'; 
    return 0;
}
n = int(input())
print(n + 1)

accept 下创建 ac1.cpp 写入如下代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a; 
    cin >> a; 
    if(a >= 0) { cout << a-1 << '\n'; }
    else { cout << a+1 << '\n'; }
    return 0;
}

可以发现 , wrong 下的两个代码分别会在 a<0a>0 时出错 , 所以我们再新建一个生成器

generator 下创建 make2.py 写入如下代码 , 注意负号

from random import randint
print(-randint(1, 1000))

可以发现这道题需要 checker , 打开 checker.cpp , 写入如下代码

#include <bits/stdc++.h>
#include "testlib.h"
using namespace std;

int main(int argc,char** argv) {
    registerTestlibCmd(argc,argv); // Required
    int n = inf.readInt();
    int m = 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值