Welcome to online-judge-tools’s documentation!¶
onlinejudge¶
onlinejudge package¶
Subpackages¶
onlinejudge.service package¶
Submodules¶
the module for Anarchy Golf (http://golf.shinh.org/)
-
class
onlinejudge.service.anarchygolf.
AnarchyGolfProblem
(*, problem_id)[source]¶ Bases:
onlinejudge.type.Problem
the module for Aizu Online Judge (http://judge.u-aizu.ac.jp/onlinejudge/)
- note
There is the offcial API http://developers.u-aizu.ac.jp/index
-
class
onlinejudge.service.aoj.
AOJArenaProblem
(*, arena_id, alphabet)[source]¶ Bases:
onlinejudge.type.Problem
New in version 6.1.0.
-
class
onlinejudge.service.aoj.
AOJProblem
(*, problem_id)[source]¶ Bases:
onlinejudge.type.Problem
- Variables
problem_id –
str
like DSL_1_A or 2256
the module for AtCoder (https://atcoder.jp/)
- note
There are some useful endpoints:
- note
There is an unofficial API https://github.com/kenkoooo/AtCoderProblems
- note
Some methods not inherited from classes
onlinejudge.type
may be modified in future, because the specification is not fixed yet.
-
class
onlinejudge.service.atcoder.
AtCoderContest
(*, contest_id)[source]¶ Bases:
onlinejudge.type.Contest
- Variables
contest_id –
str
-
iterate_submission_data_where
(*, me=False, problem_id=None, language_id=None, status=None, user_glob=None, order=None, desc=False, lang=None, pages=None, session=None)[source]¶ - Note
If you use certain combination of options, then the results may not correct when there are new submissions while crawling.
- Parameters
status (
Optional
[str
]) – must be one of AC, WA, TLE, MLE, RE, CLE, OLE, IE, WJ, WR, or Judgingorder (
Optional
[str
]) – must be one of created, score, source_length, time_consumption, or memory_consumptionme (
bool
) – use the …/submissions/me page instead of …/submissionuser_glob (
Optional
[str
]) – is used as the value of f.User query parameterlanguage_id (
Optional
[NewType()
(LanguageId
,str
)]) – is used as the value of f.Language query parameterpages (
Optional
[Iterator
[int
]]) – is an iterator to list the page numbers to GET
- Return type
-
iterate_submissions
(*, session=None)[source]¶ - Note
in implementation, use “ORDER BY created DESC” to list all submissions even when there are new submissions
- Return type
-
class
onlinejudge.service.atcoder.
AtCoderContestData
(*, contest, duration, lang, name, rated_range, response, session, start_time, timestamp)[source]¶ Bases:
onlinejudge.type.ContestData
- Variables
duration –
datetime.timedelta
lang –
str
rated_range –
str
start_time –
datetime.datetime
-
property
contest
¶ - Return type
-
property
response
¶ - Return type
Response
-
property
session
¶ - Return type
Session
-
class
onlinejudge.service.atcoder.
AtCoderContestDetailedData
(*, can_participate, penalty, **kwargs)[source]¶ Bases:
onlinejudge.service.atcoder.AtCoderContestData
- Variables
can_participate –
str
penalty –
datetime.timedelta
-
class
onlinejudge.service.atcoder.
AtCoderProblem
(*, contest_id, problem_id)[source]¶ Bases:
onlinejudge.type.Problem
- Variables
- Note
AtCoder has problems independently from contests. Therefore the notions contest_id, alphabet, and url don’t belong to problems itself.
-
download_sample_cases
(*, session=None)[source]¶ - Raises
requests.exceptions.HTTPError – if no such problem exists
SampleParseError – if parsing failed
- Return type
-
iterate_submissions
(*, session=None)[source]¶ - Note
in implementation, use “ORDER BY created DESC” to list all submissions even when there are new submissions
- Return type
-
class
onlinejudge.service.atcoder.
AtCoderProblemData
(*, alphabet, memory_limit_byte, name, problem, response, session, time_limit_msec, timestamp, html=None)[source]¶ Bases:
onlinejudge.type.ProblemData
- Note
AtCoderProblemData
is obtained the list page (e.g. https://atcoder.jp/contests/agc001/tasks )- Variables
-
property
name
¶ for example of
Problem
:器物損壊!高橋君
AtCoDeerくんと変なじゃんけん / AtCoDeer and Rock-Paper
Xor Sum
- Return type
-
property
problem
¶ - Return type
-
class
onlinejudge.service.atcoder.
AtCoderProblemDetailedData
(*, available_languages, input_format, sample_cases, score, **kwargs)[source]¶ Bases:
onlinejudge.service.atcoder.AtCoderProblemData
- Note
AtCoderProblemDetailedData
is obtained the problem page (e.g. https://atcoder.jp/contests/agc001/tasks/agc001_a )- Variables
available_languages –
Optional
[List
[Language
] ]input_format –
Optional
[str
]sample_cases –
Optional
[List
[TestCase
] ]
-
class
onlinejudge.service.atcoder.
AtCoderService
[source]¶ Bases:
onlinejudge.type.Service
-
iterate_contest_data
(*, lang='ja', session=None)[source]¶ - Parameters
lang (
str
) – must be ja (default) or en.- Note
lang=ja is required to see some Japanese-local contests.
- Note
You can use lang=en to see the English names of contests.
- Return type
-
-
class
onlinejudge.service.atcoder.
AtCoderSubmission
(*, contest_id, submission_id)[source]¶ Bases:
onlinejudge.type.Submission
-
download_data
(*, session=None)[source]¶ - Note
Exec Time is undefined when the status is RE or TLE
- Note
Memory is undefined when the status is RE or TLE
- Return type
-
get_problem
()[source]¶ - Raises
- Note
There is no way to reconstruct problem_id without networking
- Return type
-
-
class
onlinejudge.service.atcoder.
AtCoderSubmissionData
(*, code_size, exec_time_msec, language_name, memory_byte, problem, problem_id, response, score, session, status, submission, submission_time, timestamp, user_id)[source]¶ Bases:
onlinejudge.type.SubmissionData
- Variables
-
property
problem
¶ - Return type
-
property
submission
¶ - Return type
-
class
onlinejudge.service.atcoder.
AtCoderSubmissionDetailedData
(*, source_code, compile_error, test_sets, test_cases, **kwargs)[source]¶
the module for Codeforces (https://codeforces.com/)
- note
There is the offcial API https://codeforces.com/api/help
-
class
onlinejudge.service.codeforces.
CodeforcesContest
(*, contest_id, kind=None)[source]¶ Bases:
onlinejudge.type.Contest
-
class
onlinejudge.service.codeforces.
CodeforcesContestData
(*, contest, duration_seconds, frozen, name, phase, relative_time_seconds, response, session, start_time_seconds, timestamp, type)[source]¶ Bases:
onlinejudge.type.ContestData
-
property
contest
¶ - Return type
-
property
response
¶ - Return type
Response
-
property
session
¶ - Return type
Session
-
property
-
class
onlinejudge.service.codeforces.
CodeforcesProblem
(*, contest_id, index, kind=None)[source]¶ Bases:
onlinejudge.type.Problem
-
class
onlinejudge.service.codeforces.
CodeforcesProblemData
(*, name, points, problem, rating, response, session, tags, timestamp, type)[source]¶ Bases:
onlinejudge.type.ProblemData
-
property
name
¶ for example of
Problem
:器物損壊!高橋君
AtCoDeerくんと変なじゃんけん / AtCoDeer and Rock-Paper
Xor Sum
- Return type
-
property
problem
¶ - Return type
-
property
response
¶ - Return type
Response
-
property
session
¶ - Return type
Session
-
property
-
class
onlinejudge.service.codeforces.
CodeforcesService
[source]¶ Bases:
onlinejudge.type.Service
the module for CS Academy (https://csacademy.com/)
-
class
onlinejudge.service.csacademy.
CSAcademyProblem
(*, contest_name, task_name)[source]¶ Bases:
onlinejudge.type.Problem
the module for Facebook Hacker Cup (https://www.facebook.com/hackercup/)
New in version 6.5.0.
-
class
onlinejudge.service.facebook.
FacebookHackerCupProblem
(*, problem_id)[source]¶ Bases:
onlinejudge.type.Problem
- Variables
problem_id –
int
the module for HackerRank (https://www.hackerrank.com/)
-
class
onlinejudge.service.hackerrank.
HackerRankProblem
(contest_slug, challenge_slug)[source]¶ Bases:
onlinejudge.type.Problem
the module for Kattis (https://open.kattis.com/)
-
class
onlinejudge.service.kattis.
KattisProblem
(*, problem_id, contest_id=None, domain='open.kattis.com')[source]¶ Bases:
onlinejudge.type.Problem
-
class
onlinejudge.service.kattis.
KattisService
[source]¶ Bases:
onlinejudge.type.Service
-
get_url
()[source]¶ - Note
sometimes this URL is not correct, i.e. something like https://hanoi18.kattis.com/ exists
- Return type
-
the module for PKU JudgeOnline (http://poj.org/)
-
class
onlinejudge.service.poj.
POJProblem
(*, problem_id)[source]¶ Bases:
onlinejudge.type.Problem
the module for Topcoder (https://www.topcoder.com/)
- note
There is the offcial API https://tcapi.docs.apiary.io/
- note
only the Marathon Match is supported
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblem
(*, rd, cd=None, compid=None, pm=None)[source]¶ Bases:
onlinejudge.type.Problem
-
download_individual_results_feed
(*, cr, session=None)[source]¶ New in version 6.2.0: This method may be deleted in future.
- Return type
-
download_overview
(*, session=None)[source]¶ New in version 6.2.0: This method may be deleted in future.
- Return type
-
download_standings
(*, session=None)[source]¶ - Raises
Exception – if redirected to module=ViewOverview page
New in version 6.2.0: This method may be deleted in future.
- Return type
-
download_system_test
(*, test_case_id, session=None)[source]¶ - Raises
- Note
You need to parse this result manually.
New in version 6.2.0: This method may be deleted in future.
- Return type
-
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblemIndividualResultsFeed
(round_id, coder_id, handle, submissions, testcases)¶ Bases:
tuple
-
property
coder_id
¶ Alias for field number 1
-
property
handle
¶ Alias for field number 2
-
property
round_id
¶ Alias for field number 0
-
property
submissions
¶ Alias for field number 3
-
property
testcases
¶ Alias for field number 4
-
property
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblemIndividualResultsFeedSubmission
(number, score, language, time)¶ Bases:
tuple
-
property
language
¶ Alias for field number 2
-
property
number
¶ Alias for field number 0
-
property
score
¶ Alias for field number 1
-
property
time
¶ Alias for field number 3
-
property
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblemIndividualResultsFeedTestCase
(test_case_id, score, processing_time, fatal_error_ind)¶ Bases:
tuple
-
property
fatal_error_ind
¶ Alias for field number 3
-
property
processing_time
¶ Alias for field number 2
-
property
score
¶ Alias for field number 1
-
property
test_case_id
¶ Alias for field number 0
-
property
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblemOverviewRow
(rank, handle, provisional_rank, provisional_score, final_score, language, cr)¶ Bases:
tuple
-
property
cr
¶ Alias for field number 6
-
property
final_score
¶ Alias for field number 4
-
property
handle
¶ Alias for field number 1
-
property
language
¶ Alias for field number 5
-
property
provisional_rank
¶ Alias for field number 2
-
property
provisional_score
¶ Alias for field number 3
-
property
rank
¶ Alias for field number 0
-
property
-
class
onlinejudge.service.topcoder.
TopcoderLongContestProblemStandingsRow
(handle, score, rank, last_submission_time, language, example_tests, submissions, cr)¶ Bases:
tuple
-
property
cr
¶ Alias for field number 7
-
property
example_tests
¶ Alias for field number 5
-
property
handle
¶ Alias for field number 0
-
property
language
¶ Alias for field number 4
-
property
last_submission_time
¶ Alias for field number 3
-
property
rank
¶ Alias for field number 2
-
property
score
¶ Alias for field number 1
-
property
submissions
¶ Alias for field number 6
-
property
the module for Toph (https://toph.co/)
-
class
onlinejudge.service.toph.
TophProblem
(*, problem_id, contest_id=None)[source]¶ Bases:
onlinejudge.type.Problem
the module for yukicoder (https://yukicoder.me/)
- note
There is the official API https://petstore.swagger.io/?url=https://yukicoder.me/api/swagger.yaml
-
class
onlinejudge.service.yukicoder.
YukicoderProblem
(*, problem_no=None, problem_id=None)[source]¶ Bases:
onlinejudge.type.Problem
-
class
onlinejudge.service.yukicoder.
YukicoderService
[source]¶ Bases:
onlinejudge.type.Service
-
get_problems
(*, page, comp_problem=True, other=False, sort=None, session=None)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
get_solved
(*args, **kwargs)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
get_submissions
(*, page, status=None, session=None)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
get_user
(*args, **kwargs)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
get_user_favorite
(id, *, session=None)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
get_user_favorite_problem
(id, session=None)[source]¶ Deprecated since version 6.0.0: This method may be deleted in future.
-
Module contents¶
Submodules¶
onlinejudge.dispatch module¶
-
onlinejudge.dispatch.
services
¶ - Type
List
[Type
[onlinejudge.type.Service
] ]
contains classes to use for
service_from_url()
-
onlinejudge.dispatch.
problems
¶ - Type
List
[Type
[onlinejudge.type.Problem
] ]
contains classes to use for
problem_from_url()
-
onlinejudge.dispatch.
submissions
¶ - Type
List
[Type
[onlinejudge.type.Submission
] ]
contains classes to use for
submission_from_url()
-
onlinejudge.dispatch.
problem_from_url
(url)[source]¶ >>> onlinejudge.dispatch.problem_from_url("https://atcoder.jp/contests/abc077/tasks/arc084_b") <onlinejudge.service.atcoder.AtCoderProblem object at 0x7fa0538ead68>
>>> onlinejudge.dispatch.problem_from_url("https://codeforces.com/contest/1012/problem/D") <onlinejudge.service.codeforces.CodeforcesProblem object at 0x7fa05a916710>
onlinejudge.type module¶
-
class
onlinejudge.type.
Contest
[source]¶ Bases:
abc.ABC
- Note
Contest
represents just a URL of a contest, without the data of the contest.
-
class
onlinejudge.type.
DownloadedData
[source]¶ Bases:
abc.ABC
- Note
DownloadedData
and its subclasses represent contents which are obtained by network access. The values may depends your session.DownloadedData
とそのサブクラスは、ネットワークアクセスの結果得られるようなデータを表現します。その値はログイン状況などにより接続のたびに変化することがあります。
-
class
onlinejudge.type.
Language
(id, name)¶ Bases:
tuple
- Variables
id –
LanguageId
-
property
id
¶ Alias for field number 0
-
property
name
¶ Alias for field number 1
-
onlinejudge.type.
LanguageId
(x)¶ - Note
This is just a
NewType
-edstr
not, but you should not use this other than a label.
-
exception
onlinejudge.type.
LoginError
[source]¶ Bases:
RuntimeError
-
exception
onlinejudge.type.
NotLoggedInError
[source]¶ Bases:
RuntimeError
-
class
onlinejudge.type.
Problem
[source]¶ Bases:
abc.ABC
- Note
Problem
represents just a URL of a problem, without the data of the problem.Problem
はちょうど問題の URL のみを表現します。キャッシュや内部状態は持ちません。
-
submit_code
(code, language_id, *, filename=None, session=None)[source]¶ - Parameters
code (
bytes
) –language_id –
LanguageId
- Raises
- Return type
-
class
onlinejudge.type.
ProblemData
[source]¶
-
exception
onlinejudge.type.
SampleParseError
[source]¶ Bases:
RuntimeError
-
class
onlinejudge.type.
Service
[source]¶ Bases:
abc.ABC
-
class
onlinejudge.type.
Submission
[source]¶ Bases:
abc.ABC
-
class
onlinejudge.type.
SubmissionData
[source]¶ Bases:
onlinejudge.type.DownloadedData
-
abstract property
submission
¶ - Return type
-
abstract property
-
exception
onlinejudge.type.
SubmissionError
[source]¶ Bases:
RuntimeError
-
class
onlinejudge.type.
TestCase
(name, input_name, input_data, output_name, output_data)¶ Bases:
tuple
-
property
input_data
¶ Alias for field number 2
-
property
input_name
¶ Alias for field number 1
-
property
name
¶ Alias for field number 0
-
property
output_data
¶ Alias for field number 4
-
property
output_name
¶ Alias for field number 3
-
property
Module contents¶
How to run CI on your library for competitive programming (Japanese)¶
あなたが競技プログラマなら、おそらく自分用の競技プログラミング用のライブラリを内製していることでしょう。 そのようなライブラリには「そのライブラリを使った提出が既存の問題で AC することを確認する」という形の手動でのテストが行われるのが通常です。
しかしこれはとても面倒な作業です。 そして、単に忘れてしまったり、「修正は 1 行だけなので提出してテストしなくてもいいかな」などと言い訳して省略されてしまったりします。 そのようなライブラリにはきっとバグが潜んでいることでしょう。
ではどうすればよいでしょうか? もちろんこれは自動化によって解決できます。
Test Script¶
online-judge-tools には、ライブラリのテストに利用できる機能があります。 それらを組み合わせればテストの自動化が可能です。
例えば以下のようなシェルスクリプトを書いておくとよいでしょう。
まず .test.cpp
という拡張子を持つファイルを作り、その中で #define PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_A&lang=jp
のような形で問題を指定しておきます (例: union_find_tree.test.cpp)。
するとこのスクリプトは、そのような拡張子のファイルを探し、自動でコードをコンパイルし、システムテストの入出力を自動で取得し、テストをしてくれます。
ローカルでの実行なのでサーバには比較的やさしいです。
#!/bin/bash
set -e
which oj > /dev/null
CXX=${CXX:-g++}
CXXFLAGS="${CXXFLAGS:--std=c++14 -O2 -Wall -g}"
ulimit -s unlimited
run() {
file="$1"
url="$(grep -o '^# *define \+PROBLEM \+\(https\?://.*\)' < "$file" | sed 's/.* http/http/')"
dir=test/$(echo -n "$url" | md5sum | sed 's/ .*//')
mkdir -p ${dir}
$CXX $CXXFLAGS -I . -o ${dir}/a.out "$file"
if [[ -n ${url} ]] ; then
if [[ ! -e ${dir}/test ]] ; then
sleep 2
oj download --system "$url" -d ${dir}/test
fi
oj test --tle 10 --c ${dir}/a.out -d ${dir}/test
else
${dir}/a.out
fi
}
if [ $# -eq 0 ] ; then
for f in $(find . -name \*.test.cpp) ; do
run $f
done
else
for f in "$@" ; do
run "$f"
done
fi
ただし実質的に AOJ にしか対応していないので注意してください。 Codeforces はシステムテストのケースを配布してくれていませんし、 AtCoder は配布してくれてはいますが DropBox 経由なので自動化が困難なためです。
このスクリプトはあくまで一例であり、「Python にも対応させたい」「差分だけテストしたい」などの要求がある場合は各々で拡張してください (例: test.sh)。
Continuous Integration¶
「実行すると自動でテストしてくれるスクリプトがある」というだけではまだ不足です。 なぜならそのスクリプト自体は人間が手動で実行しなければならないためです。 この問題を解決するものは Continuous Integration (CI) と呼ばれます。
CI とは、自動で継続的にテストを行う仕組みや運用のことです。 GitHub のリポジトリにコミットが追加されるたびに自動でテストが実行されるようにしておく、というのはその例です。
もしあなたがライブラリを GitHub 上で管理しているのなら、 CI の導入は簡単です。
CI を実行してくれるサービスのひとつである Travis CI を利用しましょう。
Travis CI のページ https://travis-ci.org/ から登録してライブラリの GitHub レポジトリとの連携を有効化し、前節のシェルスクリプトを test.sh
という名前で保存しているとき、以下の内容の .travis.yml
というファイルを作れば終了です。
language: cpp
compiler:
- clang
- gcc
dist: xenial
addons:
apt:
packages:
- python3
- python3-pip
- python3-setuptools
before_install:
- pip3 install -U setuptools
- pip3 install -U online-judge-tools=='6.*'
script:
- bash test.sh
自動で実行されたテスト結果は Travis CI 上のページ (例: https://travis-ci.org/kmyk/competitive-programming-library) などから見ることができます。
https://img.shields.io/travis/USER/REPO/master.svg
の形の URL から のようなバッジを生成できるので、これを README に貼っておくのもよいでしょう。
このバッチはテストの成功失敗に応じて色が勝手に変化します。