Catalog PyPI
PACKAGE EXPLORERView in registry

acmhelper

PyPI

The helper for Acmer

Versions collected1
Direct dependencies2From release 0.1.1
Last observed20 Oct, 18:19 UTC

README

Version 0.1.1 documentation

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 , 写入一个不连通的 DAG

5 2
1 2 3
1 3 5
1 5 -7

在该文件目录下输入 helper render -dic test.in

查看 test.png , 应该如下所示

test

具体的设置请使用 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 , 没有使用 interactor 和 validator , 使用 -std=c++17 编译

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

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

在 wrong 下创建 wa1.cpp 和 wa2.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<0 和 a>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 , 完成了.

如果字体和终端合适 , 你应该会看到像这样的东西

result

不出意料地 , 两个不对的程序在合适的地方不对了.

作为结尾 , 我们来使用 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 等

Downloads & popularity

1downloads
1-day window · source-reported counts20 Oct 2026
84420
2026-07-23: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-07-23–2026-07-232026-07-27: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-07-27–2026-07-272026-08-01: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-01–2026-08-012026-08-02: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-02–2026-08-022026-08-03: 8 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-03–2026-08-032026-08-04: 5 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-04–2026-08-042026-08-06: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-06–2026-08-062026-08-07: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-07–2026-08-072026-08-09: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-09–2026-08-092026-08-13: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-13–2026-08-132026-08-14: 4 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-14–2026-08-142026-08-16: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-16–2026-08-162026-08-17: 6 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-17–2026-08-172026-08-18: 84 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-18–2026-08-182026-08-19: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-19–2026-08-192026-08-20: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-20–2026-08-202026-08-21: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-21–2026-08-212026-08-23: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-23–2026-08-232026-08-24: 9 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-24–2026-08-242026-08-28: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-28–2026-08-282026-08-31: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-08-31–2026-08-312026-09-03: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-03–2026-09-032026-09-06: 4 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-06–2026-09-062026-09-07: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-07–2026-09-072026-09-09: 7 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-10–2026-09-102026-09-12: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-12–2026-09-122026-09-15: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-15–2026-09-152026-09-20: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-20–2026-09-202026-09-25: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-25–2026-09-252026-09-26: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-26–2026-09-262026-09-28: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-28–2026-09-282026-09-30: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-09-30–2026-09-302026-10-06: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-06–2026-10-062026-10-07: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-07–2026-10-072026-10-08: 4 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-08–2026-10-082026-10-09: 3 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-09–2026-10-092026-10-11: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-11–2026-10-112026-10-12: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-12–2026-10-122026-10-13: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-13–2026-10-132026-10-19: 2 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-19–2026-10-192026-10-20: 1 · observed 2026-10-21T14:35:32.4125969Z · period 2026-10-20–2026-10-20
23 Jul20 Oct

pypistats · 42 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2012026-10-21T14:35:32.4125969Z
2026-10-19 – 2026-10-1922026-10-21T14:35:32.4125969Z
2026-10-13 – 2026-10-1312026-10-21T14:35:32.4125969Z
2026-10-12 – 2026-10-1212026-10-21T14:35:32.4125969Z
2026-10-11 – 2026-10-1122026-10-21T14:35:32.4125969Z
2026-10-09 – 2026-10-0932026-10-21T14:35:32.4125969Z
2026-10-08 – 2026-10-0842026-10-21T14:35:32.4125969Z
2026-10-07 – 2026-10-0722026-10-21T14:35:32.4125969Z
2026-10-06 – 2026-10-0612026-10-21T14:35:32.4125969Z
2026-09-30 – 2026-09-3012026-10-21T14:35:32.4125969Z
2026-09-28 – 2026-09-2832026-10-21T14:35:32.4125969Z
2026-09-26 – 2026-09-2632026-10-21T14:35:32.4125969Z
2026-09-25 – 2026-09-2532026-10-21T14:35:32.4125969Z
2026-09-20 – 2026-09-2012026-10-21T14:35:32.4125969Z
2026-09-15 – 2026-09-1522026-10-21T14:35:32.4125969Z
2026-09-12 – 2026-09-1222026-10-21T14:35:32.4125969Z
2026-09-10 – 2026-09-1012026-10-21T14:35:32.4125969Z
2026-09-09 – 2026-09-0972026-10-21T14:35:32.4125969Z
2026-09-07 – 2026-09-0722026-10-21T14:35:32.4125969Z
2026-09-06 – 2026-09-0642026-10-21T14:35:32.4125969Z
2026-09-03 – 2026-09-0312026-10-21T14:35:32.4125969Z
2026-08-31 – 2026-08-3122026-10-21T14:35:32.4125969Z
2026-08-28 – 2026-08-2812026-10-21T14:35:32.4125969Z
2026-08-24 – 2026-08-2492026-10-21T14:35:32.4125969Z
2026-08-23 – 2026-08-2332026-10-21T14:35:32.4125969Z
2026-08-21 – 2026-08-2112026-10-21T14:35:32.4125969Z
2026-08-20 – 2026-08-2012026-10-21T14:35:32.4125969Z
2026-08-19 – 2026-08-1922026-10-21T14:35:32.4125969Z
2026-08-18 – 2026-08-18842026-10-21T14:35:32.4125969Z
2026-08-17 – 2026-08-1762026-10-21T14:35:32.4125969Z
2026-08-16 – 2026-08-1622026-10-21T14:35:32.4125969Z
2026-08-14 – 2026-08-1442026-10-21T14:35:32.4125969Z
2026-08-13 – 2026-08-1332026-10-21T14:35:32.4125969Z
2026-08-09 – 2026-08-0922026-10-21T14:35:32.4125969Z
2026-08-07 – 2026-08-0712026-10-21T14:35:32.4125969Z
2026-08-06 – 2026-08-0612026-10-21T14:35:32.4125969Z
2026-08-04 – 2026-08-0452026-10-21T14:35:32.4125969Z
2026-08-03 – 2026-08-0382026-10-21T14:35:32.4125969Z
2026-08-02 – 2026-08-0222026-10-21T14:35:32.4125969Z
2026-08-01 – 2026-08-0112026-10-21T14:35:32.4125969Z
2026-07-27 – 2026-07-2722026-10-21T14:35:32.4125969Z
2026-07-23 – 2026-07-2332026-10-21T14:35:32.4125969Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.125 Oct 20222

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:19 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:2a511925a26bb953ad26c18a0f236a3d8f50ef46433a03d26a8f532e78b25176