Online Judge Template Generator
ใพใ ไธๅฎๅฎ็ใชใฎใงๅใๅบๅใใใฆใฆใๆใใชใใงใญใ ใใฎใใกๅฎ่ฃ ใใใใจใฎใชในใใฏ TODO ใซใใใพใ
ใใใฏใชใซ
็ซถๆใใญใฐใฉใใณใฐใใณใใฌใผใใไฝใฃใฆใใใใใคใงใใ kyuridenamida/atcoder-tools ใๅ่ใซใใใฎๆฌ่ณช้จๅใ ใใๆใๅบใใฆๅๅฎ่ฃ ใใพใใใ
ไธป็ฎ็ใฏไปฅไธใฎใตใใคใงใ:
- ไธ้ฉๅใชๅ
ฅๅบๅๆนๆณใ็จใใใใจใซใใ 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
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"
(ใพใ ไธๅฎๅฎ็ใงใใใ่จญๅฎ็ญใฎๅพๆนไบๆๆงใฏไฟ่จผใใใพใใ)
Example
$ oj-contest https://atcoder.jp/contests/abc158
...
$ tree ~/atcoder.jp
/home/ubuntu/atcoder.jp
โโโ abc158
โโโ abc158_a
โย ย โโโ generate.py
โย ย โโโ main.cpp
โย ย โโโ test
โย ย โโโ sample-1.in
โย ย โโโ sample-1.in
โย ย โโโ sample-1.out
โย ย โโโ sample-2.in
โย ย โโโ sample-2.out
โย ย โโโ sample-3.in
โย ย โโโ sample-3.out
โโโ ...
โโโ ...
โโโ ...
โโโ ...
โโโ abc158_f
โโโ generate.py
โโโ main.cpp
โโโ 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
$ cat ~/atcoder.jp/abc158/abc158_f/main.cpp
#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;
auto solve(int N, const vector<int> & X, const vector<int> & D) {
// TODO: edit here
}
// generated by online-judge-template-generator
int main() {
int N;
scanf("%d", &N);
vector<int > X(N), D(N);
REP (i, N) {
scanf("%d%d", &X[i], &D[i]);
}
auto ans = solve(N, X, D);
printf("%d\n", ans); // TODO: edit here
return 0;
}
$ cat ~/atcoder.jp/abc158/abc158_f/generate.py
#!/usr/bin/env python3
import random
import onlinejudge_random as random_oj
def main():
N = random.randint(1, 10 ** 9) # TODO: edit here
X = [None for _ in range(N)]
D = [None for _ in range(N)]
for i in range(N):
X[i] = random.randint(1, 10 ** 9) # TODO: edit here
D[i] = random.randint(1, 10 ** 9) # TODO: edit here
print(N)
for i in range(N):
print(X[i], D[i])
if __name__ == "__main__":
main()
Architecture
- download and recognize HTML with requests + beautifulsoup4
- parse the
<pre>
format in old style Lex + Yacc (ply) - generate codes with a template engine (Mako)
How it works
ใใจใใฐ Library Checker ใฎๅ้ก Static RQM ใซใคใใฆ่ใใฆใฟใพใใใใ ใใฎๅ้กใฎๅ ฅๅใใฉใผใใใใฏๆฌกใฎใใใซใชใฃใฆใใพใใ
n m
aโ aโ โฆ aโโโ
lโ rโ
โฎ
lโ rโ
ใใใใพใไปฅไธใฎใใใชใใผใฏใณๅใซๅ่งฃใใพใใ ๆ็ดใซ่ฒชๆฌฒใใใใ ใใงใใใฐใ่ฆๅใใชใใฎใงใปใผ O(n) ใงใใๆญฃ่ฆ่กจ็พใงไพฟๅฉใซๆธใใๆขๅญใฎใใผใซใใใใฎใงใใใๅฉ็จใใฆใใพใใ
[
"ident(n)", "ident(m)", "newline()",
"ident(a)", "subscript()", "number(0)", "ident(a)", "subscript()", "number(1)", "dots()", "ident(a)", "subscript()", "ident(n)", "binop(-)", "number(1)", "newline()",
"ident(l)", "subscript()", "number(1)", "ident(r)", "subscript()", "number(1)", "newline()",
"vdots(1)", "newline()",
"ident(l)", "subscript()", "ident(m)", "ident(r)", "subscript()", "ident(m)", "newline()"
]
ใใฎใใผใฏใณๅใ่งฃๆใใฆๆฌกใฎใใใชๆจใธๅคๅฝขใใพใใ ใพใๆ่่ช็ฑๆๆณใง่งฃๆใงใใ็ฏๅฒใๅฆ็ใใฆๆจใไฝใฃใๅพใซใๆ่ไพๅญใฝใ้จๅใ ad-hoc ใซๅฆ็ใใฆใใๆด็ใใใๆจใซ็ตใฟๆใใฆใใพใใ ๆ่่ช็ฑ้จๅใฏ O(n^3) ใฎๆ็ดใชๅบ้ DP (CYKๆณ) ใงใใใใงใใใ่ฆๅใๅๆใใใฐๆฎใใใใๆใใซใใฃใฆใใใๆขๅญใฎใใผใซ (Yacc) ใซไปปใใฆใปใผ็ทๅฝข (LALRๆณ) ใงๅฎ่ฃ ใใใฆใใพใใ
[
{"type": "var", "name": "n"},
{"type": "var", "name": "m"},
{"type": "newline"},
{"type": "loop", "counter": "i", "size": "n", "body": [
{"type": "var", "name": "a", "subscript": "i"}
]},
{"type": "newline"},
{"type": "loop", "counter": "j", "size": "m", "body": [
{"type": "var", "name": "l", "subscript": "j + 1"},
{"type": "var", "name": "r", "subscript": "j + 1"},
{"type": "newline"}
]}
]
ใใฎๆจใๅคๆใใฆใฝใผในใณใผใใซใใพใใ ๆจใฎ็ณใฟ่พผใฟใจใๆจ DP ใจใ่จใใใ O(n) ใ O(nยฒ) ใใใใฎๆ็ดใใใพใใ ไฝใใใฃใฆใๅคๆใฏใงใใพใใใ(1.) ใพใใใฉใผใใใๆจใ C++ ใฎๆงๆๆจใซๅใใ(2.) ใใใๆ้ฉๅใใ(3.) ใใใ่กใฎๅใซ็ดๅๅใใ(4.) ใคใณใใณใใๆดใใฆๅบๅใใใใจใใ 4 ๆฎต้ใซๅใใใจๅฎ่ฃ ใๆฅฝใใคๅบๅใใใใใงใใ
int n, m;
scanf("%d%d", &n, &m);
std::vector<int> a(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
std::vector<int> l(m), r(m);
for (int j = 0; j < m; ++j) {
scanf("%d%d", &l[j], &r[j]);
}
ใใฎไธ้ฃใฎไฝๆฅญใใใใใใใฃใฆใใใใฎใใใฎใใผใซใงใใ
License
MIT License