Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/online-judge-tools/template-generator
Analyze problems of competitive programming and automatically generate boilerplate
https://github.com/online-judge-tools/template-generator
atcoder automation code-generation codeforces competitive-programming cpp programming-contests python templates testing
Last synced: 3 days ago
JSON representation
Analyze problems of competitive programming and automatically generate boilerplate
- Host: GitHub
- URL: https://github.com/online-judge-tools/template-generator
- Owner: online-judge-tools
- License: mit
- Created: 2017-01-13T21:04:34.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2024-02-13T09:31:47.000Z (9 months ago)
- Last Synced: 2024-11-07T18:01:17.832Z (6 days ago)
- Topics: atcoder, automation, code-generation, codeforces, competitive-programming, cpp, programming-contests, python, templates, testing
- Language: Python
- Homepage:
- Size: 320 KB
- Stars: 86
- Watchers: 6
- Forks: 11
- Open Issues: 9
-
Metadata Files:
- Readme: README.ja.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# online-judge-tools/template-generator
[![test](https://github.com/kmyk/online-judge-template-generator/workflows/test/badge.svg)](https://github.com/kmyk/online-judge-template-generator/actions)
[![Documentation Status](https://readthedocs.org/projects/online-judge-template-generator/badge/)](https://online-judge-template-generator.readthedocs.io/en/latest/)
[![PyPI](https://img.shields.io/pypi/v/online-judge-template-generator)](https://pypi.org/project/online-judge-template-generator/)
[![LICENSE](https://img.shields.io/pypi/l/online-judge-template-generator.svg)](https://github.com/kmyk/online-judge-template-generator/blob/master/LICENSE)[README in English](https://github.com/online-judge-tools/template-generator)
## What is this
競技プログラミングの問題を解析してテンプレートコードを出力してくれるツールです。
[kyuridenamida/atcoder-tools](https://github.com/kyuridenamida/atcoder-tools) を参考に、その本質部分だけを抜き出して再実装しました。
内部構造については [How it works](https://online-judge-template-generator.readthedocs.io/en/latest/how-it-works.html) に書かれています。主目的は以下のふたつです:
- 不適切な入出力方法を用いたことによる TLE を回避すること。たとえば「Codeforces で `std::endl` を使って TLE する」みたいなのをなくしたい
- ランダムケースを生成してのテストを気軽に行えるようにすること。たとえば、サンプル AC して提出してみたら謎の WA が出たとき「これランダムケース生成して愚直解と比較すれば原因分かるだろうけど、面倒なんだよな」ってなりがちですが、この面倒を半減させ高速にデバッグできるようにしたい## Resources
オンライン上の試用版:
有志による紹介記事 (日本語):
- [Online Judge Template Generator を Windows 10 + Python で使う:AtCoder コンテストにおける提出コードの作成,テストから提出まで - はむ吉(のんびり)の練習ノート](https://hamukichi.hatenablog.jp/entry/2020/09/17/230818)
## How to install
``` console
$ pip3 install online-judge-template-generator
```## Usage
`oj-template` コマンドは、指定された問題を解析し、その問題のための入出力パート (`int n; std::cin >> n;` など) を含むテンプレートファイル (`main.cpp` など) やランダムケース生成器 (`generate.py` など) を自動生成します。詳細は [Examples](#examples) を見てください。
[`oj` コマンド](https://github.com/kmyk/online-judge-tools) が認識できる問題であれば何に対してでも動作します。``` console
$ oj-template [-t TEMPLATE] URL
````oj-prepare` コマンドは、指定された問題やコンテストに対し、テンプレート生成やサンプルのダウンロードを一括で行います。
これは `oj` コマンドと `oj-template` コマンドの薄いラッパーです。
[`oj` コマンド](https://github.com/kmyk/online-judge-tools) が認識できる問題であれば何に対してでも動作します。``` console
$ oj-prepare URL
```### Supported languages
`oj-template` が認識する組み込みのテンプレートとして以下が使えます。
- `main.cpp`: C++ 解法コード
- `main.py`: Python 解法コード
- `generate.py`: Python ランダムケース生成器
- `generate.cpp`: C++ ランダムケース生成器### Generating random cases
ランダムケースの生成は、`oj-prepare https://...` コマンドを実行し、生成された `generate.py` を修正した後に、次のように実行してください。
``` console
$ oj generate-input "python3 generate.py"
```ファイル `generate.py` は `oj-template -t generate.py "https://..."` というコマンドの実行によっても生成できます。
## Examples
``` console
$ oj-template https://codeforces.com/contest/1300/problem/D
...#include
#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 n, const vector & a, const vector & b) {
// TODO: edit here
}// generated by online-judge-template-generator v4.4.0 (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 n;
cin >> n;
vector a(n), b(n);
REP (i, n) {
cin >> a[i] >> b[i];
}
auto ans = solve(n, a, b);
cout << (ans ? YES : NO) << endl;
return 0;
}
`````` console
$ oj-template -t generate.py https://judge.yosupo.jp/problem/staticrmq
...#!/usr/bin/env python3
import random
import onlinejudge_random as random_ojdef 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()
`````` console
$ oj-prepare https://atcoder.jp/contests/abc158
...$ tree
.
├── 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.out13 directories, 50 files
```## Settings
### oj-template
`oj-template` のためのテンプレートは `-t` オプションによって指摘できます。
組み込みで用意されているテンプレートの一覧は [onlinejudge_template_resources/template/](https://github.com/online-judge-tools/template-generator/tree/master/onlinejudge_template_resources/template) で見られます。
たとえば [generate.cpp](https://github.com/online-judge-tools/template-generator/blob/master/onlinejudge_template_resources/template/generate.cpp) を利用したい場合は `oj-template -t generate.cpp https://...` としてください。テンプレートを自分で作成することもできます。
テンプレート記法は [Mako](https://www.makotemplates.org/) のものを使います。
[fastio_sample.cpp](https://github.com/kmyk/online-judge-template-generator/blob/master/onlinejudge_template_resources/template/fastio_sample.cpp) とか [customize_sample.cpp](https://github.com/kmyk/online-judge-template-generator/blob/master/onlinejudge_template_resources/template/customize_sample.cpp) とかを見ていい感じに書いてください。
API ドキュメントは [onlinejudge_template.generator package](https://online-judge-template-generator.readthedocs.io/en/latest/onlinejudge_template.generator.html) にあります。自分で書いたテンプレートを `-t` オプションで指定するときは、文字列中にパス区切り文字 `/` が含まれるようにしてパスを指定してください (シェルスクリプトでの実行ファイルの指定と同様です)。
たとえば `customized.py` というテンプレートを書いたときは、`oj-template -t ./customized.py https://...` や `oj-template -t /path/to/customized.py https://...` のように指定してください。
また、特定のディレクトリ (Linux の場合は `~/.config/online-judge-tools/template/`) の下に `~/.config/online-judge-tools/template/customized.py` のようにファイルを配置しておくことで、`oj-template -t customized.py https://...` のように指定できるようにもなります。組み込みのテンプレートと同じ名前のテンプレートがこのディレクトリにあれば上書きされます。### oj-prepare
`oj-prepare` の設定は (Linux の場合は) `~/.config/online-judge-tools/prepare.config.toml` で行えます。MacOS の場合は `/Users/{user_name}/Library/Application Support/online-judge-tools/prepare.config.toml` で行えます。以下のように書いてください。
``` toml
contest_directory = "~/Desktop/{service_domain}/{contest_id}/{problem_id}"
problem_directory = "."[templates]
"main.py" = "main.py"
"naive.py" = "main.py"
"generate.py" = "generate.py"
```設定項目:
- `problem_directory` (string): 問題の URL が指定された場合は `{problem_directory}` にファイルが用意される。
- default: `.`
- 使える変数:
- `{problem_id}`: 問題 ID (`abc123_d` など)
- `contest_directory` (string): コンテストの URL が指定された場合は `{contest_directory}/{problem_directory}` にファイルが用意される。(default:
- default: `{problem_id}`
- 使える変数:
- `{problem_id}`: 問題 ID (`abc123_d` など)
- `{contest_id}`: コンテスト ID (`abc123` など)
- `{service_domain}`: サービスのドメイン (`atcoder.jp` など)
- `{service_name}`: サービスの名前 (`AtCoder` など)
- `templates` (table of string): value (右側) のテンプレートによる生成結果を key (左側) で指定したパスに配置する。
- example: `{ "solution.cpp" = "main.cpp", "naive.py" = main.py", "generate.cpp" = "generate.cpp" }`
- default: `{ "main.cpp" = "main.cpp", "main.py" = "main.py", "generate.py" = "generate.py" }`## License
MIT License