Skip to main content

A simple template generator for competitive programming

Project description

Online Judge Template Generator

test Documentation Status PyPI LICENSE

(CAUTION: the current version is unstable. see Compatibility / 注意: 現在はまだ開発中のバージョンです。互換性については読んでおいてください)

What is this

競技プログラミングテンプレートを作ってくれるやつです。 kyuridenamida/atcoder-tools を参考に、その本質部分だけを抜き出して再実装しました。 内部構造については How it works に書かれています。

主目的は以下のふたつです:

  • 不適切な入出力方法を用いたことによる TLE を回避すること。たとえば「Codeforces で std::endl を使って TLE する」みたいなのをなくしたい
  • ランダムケースを生成してのテストを気軽に行えるようにすること。たとえば、サンプル AC して提出してみたら謎の WA が出たとき「これランダムケース生成して愚直解と比較すれば原因分かるだろうけど、面倒なんだよな」ってなりがちですが、この面倒を半減させ高速にデバッグできるようにしたい

How to install

$ pip3 install online-judge-template-generator

Usage

oj-template コマンドは、指定された問題に対し、入出力パートを自動生成します。 入出力解析は AtCoder と yukicoder と Library Checker にのみ対応していますが、それら以外でも一応は動きます。

$ oj-template [-t TEMPLATE] URL

oj-contest コマンドは、指定された問題やコンテストに対し、テンプレート生成やサンプルのダウンロードを一括で行います。 oj コマンド が動くやつなら何に対してでも動きます。

$ oj-contest URL

Generating random cases

ランダムケースの生成は、oj-contest コマンドがデフォルトで生成する generate.py を修正した後に、次のように実行してください。

$ oj generate-input "python3 generate.py"

ファイル generate.pyoj-template -t generate.py "https://..." というコマンドの実行によっても生成できます。

また、ランダムケース生成を補助するための module onlinejudge_random が用意されています。詳細はドキュメントを確認してください。

Examples

$ oj-template https://codeforces.com/contest/1300/problem/D
...

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) ::std::begin(x), ::std::end(x)
using namespace std;

const string YES = "YES";
const string NO = "nO";
bool solve(int vam, const vector<int64_t> & kfi, const vector<int64_t> & vkw) {
    // TODO: edit here
}

// generated by online-judge-template-generator (https://github.com/kmyk/online-judge-template-generator)
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    constexpr char endl = '\n';
    int vam;
    cin >> vam;
    vector<int64_t> kfi(vam), vkw(vam);
    REP (i, vam) {
        cin >> kfi[i] >> vkw[i];
    }
    bool ans = solve(vam, kfi, vkw);
    cout << (ans ? YES : NO) << endl;
    return 0;
}
$ oj-template -t generate.py https://judge.yosupo.jp/problem/staticrmq
...

#!/usr/bin/env python3
import random
import onlinejudge_random as random_oj

def main():
    N = random.randint(1, 10 ** 9)  # TODO: edit here
    a = [None for _ in range(N)]
    Q = random.randint(1, 10 ** 9)  # TODO: edit here
    l = [None for _ in range(Q)]
    r = [None for _ in range(Q)]
    for i in range(N):
        a[i] = random.randint(1, 10 ** 9)  # TODO: edit here
    for i in range(Q):
        l[i] = random.randint(1, 10 ** 9)  # TODO: edit here
        r[i] = random.randint(1, 10 ** 9)  # TODO: edit here
    print(N, Q)
    print(*[a[i] for i in range(N)])
    for i in range(Q):
        print(l[i], r[i])

if __name__ == "__main__":
    main()
$ oj-contest https://atcoder.jp/contests/abc158
...

$ tree ~/atcoder.jp
/home/ubuntu/atcoder.jp
└── abc158
    ├── abc158_a
    │   ├── main.cpp
    │   ├── main.py
    │   ├── generate.py
    │   └── test
    │       ├── sample-1.in
    │       ├── sample-1.in
    │       ├── sample-1.out
    │       ├── sample-2.in
    │       ├── sample-2.out
    │       ├── sample-3.in
    │       └── sample-3.out
    ├── ...
    ├── ...
    ├── ...
    ├── ...
    └── abc158_f
        ├── main.cpp
        ├── main.py
        ├── generate.py
        └── test
            ├── sample-1.in
            ├── sample-1.out
            ├── sample-2.in
            ├── sample-2.out
            ├── sample-3.in
            ├── sample-3.out
            ├── sample-4.in
            └── sample-4.out

13 directories, 50 files

Settings

oj-template のためのテンプレートは ~/.config/online-judge-tools/template/ の下に ~/.config/online-judge-tools/template/customized.py のように作って oj-template -t customized.py https://... のように指定する。 テンプレート記法は Mako のものを使う。 fastio.cpp とか customize_sample.cpp とかを見てそれっぽく書けば動く。

oj-contest の設定は ~/.config/online-judge-tools/oj2.config.toml に次のように設定する。

problem_directory = "~/{service_domain}/{contest_id}/{problem_id}"

[templates]
"main.cpp" = "template.cpp"
"generate.py" = "generate.py"

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for online-judge-template-generator, version 2.8.0
Filename, size File type Python version Upload date Hashes
Filename, size online_judge_template_generator-2.8.0-py3-none-any.whl (39.7 kB) File type Wheel Python version py3 Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page