A Docker Based Online Judge Engine
Project description
dockerjudge
🎌 🇺🇸 English | 🇨🇳 大陆简体
A Docker based online judge engine, which supports 5+ programming language processors:
Installation
From the Python Package Index (PyPI)
Via pip
pip install dockerjudge
Via Easy install (deprecated)
easy_install dockerjudge
From GitHub
piterator-org/dockerjudge: A Docker Based Online Judge Engine
- HTTPS:
https://github.com/piterator-org/dockerjudge.git - SSH:
git@github.com:piterator-org/dockerjudge.git
git clone https://github.com/piterator-org/dockerjudge.git
cd dockerjudge
make pip && make # python3 -m pip install -Ur requirements.txt && python3 setup.py build
sudo make install # python3 setup.py install
Usage
>>> from dockerjudge import judge
>>> from dockerjudge.processor import GCC, Clang, Python, Node, OpenJDK
>>>
>>> judge(
... GCC(GCC.Language.c), # or `GCC('c')` / `GCC('C')`, which means compile the source code in the C programming language with `gcc` command
... b'''
... #include <stdio.h>
... int main() {
... int a, b;
... scanf("%d %d", &a, &b);
... printf("%d", a / b);
... return 0;
... }
... ''',
... [
... (b'1 1', b'1'), # AC
... (b'1 2', b'0.5'), # WA
... (b'0 0', b'') # RE
... ]
... )
[
[
(<Status.AC: 'Accepted'>, (b'1', b''), 0.001),
(<Status.WA: 'Wrong Answer'>, (b'0', b''), 0.001),
(<Status.RE: 'Runtime Error'>, (None, b'Floating point exception (core dumped)\n'), 0.01)
],
b''
]
>>>
>>> judge(GCC(GCC.Language.c), b'', [(b'', b'')]) # CE
[
[
(<Status.CE: 'Compilation Error'>, (None, None), 0.0)
],
b"/usr/bin/ld: /usr/lib/x86_64-linux-gnu/crt1.o: in function `_start':\n(.text+0x20): undefined reference to `main'\ncollect2: error: ld returned 1 exit status\n"
]
>>>
>>> judge(
... GCC(GCC.Language.cpp), # or `GCC('cpp')` / `GCC('C++')`, which means compile the source code in the C++ programming language with `g++` command
... b'''
... #include <cstdio>
... int main() {
... printf("Hello, world!");
... while (true)
... ;
... }
... ''',
... [
... (b'', b'Hello, world!') # TLE
... ],
... {
... 'limit': {
... 'time': .1
... }
... }
... )
[
[
(<Status.TLE: 'Time Limit Exceeded'>, (None, b'bash: line 1: 35 Killed timeout -sKILL 0.1 sh -c ./a.out > /dockerjudge/1.out < /dockerjudge/1.in\n'), 0.100)
],
b''
]
>>>
>>> judge(
... GCC(
... GCC.Language.c,
... 'latest', # The GCC version number, such as `4`, `4.8`, etc.
... {'bin': 'a'} # The binary filename, which passes to `gcc`'s `-o` option
... ),
... b'''
... #include <stdio.h>
... int main() {
... int a, b;
... freopen("a.in", "r", stdin); // Open `a.in` as stdin
... scanf("%d %d", &a, &b); // Scan from `a.in`
... freopen("a.out", "w", stdout); // Open `a.out` as stdout
... printf("%d", a / b); // Print to `a.out`
... return 0;
... }
... ''',
... [
... (b'1 1', b'1'), # AC
... (b'1 2', b'0.5'), # WA
... (b'0 0', b'') # RE
... ],
... {
... 'iofilename': {
... 'in': 'a.in',
... 'out': 'a.out'
... }
... }
... )
[
[
(<Status.AC: 'Accepted'>, (b'1', b''), 0.001),
(<Status.WA: 'Wrong Answer'>, (b'0', b''), 0.001),
(<Status.RE: 'Runtime Error'>, (None, b'Floating point exception (core dumped)\n'), 0.001)
],
b''
]
>>>
>>> judge(
... GCC(GCC.Language.c, filenames={'bin': 'a'}),
... b'''
... #include <stdio.h>
... int main() {
... int a, b;
... scanf("%d %d", &a, &b);
... printf("%d", a / b);
... return 0;
... }
... ''',
... [
... (b'1 1', b'1'),
... (b'0 0', b'')
... ],
... {
... 'iofilename': {
... 'out': 'a.out' # ONF
... }
... }
... )
[
[
(<Status.ONF: 'Output Not Found'>, (None, b''), 0.001),
(<Status.RE: 'Runtime Error'>, (None, b'Floating point exception (core dumped)\n'), 0.001)
],
b''
]
>>>
>>> judge( # BTW, GCC starting from 4.9 also supports Go, named `gccgo`
... GCC(GCC.Language.go),
... b'package main\n'
... b''
... b'import "fmt"\n'
... b''
... b'func main() {\n'
... br' fmt.Printf("hello, world\n")'b'\n'
... b'}\n',
... [(b'', b'hello, world')]
... )
[
[
(<Status.AC: 'Accepted'>, (b'hello, world\n', b''), 0.02)
],
b''
]
>>>
>>> judge(
... Clang( # Besides GCC, LLVM Clang is also supported (The same arguments as GCC's)
... Clang.Language.c, # Only C and C++ supported
... 11 # The version number of LLVM CLang is **required**!
... ),
... b'', # CE
... [
... (b'', b'')
... ]
... )
[
[
(<Status.CE: 'Compilation Error'>, (None, None), 0.0)
],
b"/usr/bin/ld: /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crt1.o: in function `_start':\n'
b"(.text+0x24): undefined reference to `main'\n"
b'clang: error: linker command failed with exit code 1 (use -v to see invocation)\n'
]
>>>
>>> # Other programming languages are also supported
>>> judge(Bash(), b'echo Hello, world!', [(b'', b'Hello, world!')]) # Bash
[
[
(<Status.AC: 'Accepted'>, (b'Hello, world!\n', b''), 0.001)
],
b''
]
>>>
>>> judge(Python(3), b"print('Hello, world!')", [(b'', b'Hello, world!')]) # Python 3
[
[
(<Status.AC: 'Accepted'>, (b'Hello, world!\n', b''), 0.05)
],
b"Listing '.'...\n"
b"Compiling './__init__.py'...\n"
]
>>> judge(PyPy(), b"print('Hello, world!')", [(b'', b'Hello, world!')]) # PyPy 3
[
[
(<Status.AC: 'Accepted'>, (b'Hello, world!\n', b''), 0.075)
],
b"Listing '.'...\n"
b"Compiling './__init__.py'...\n"
]
>>>
>>> judge(Node(12), b'console.log("Hello World")', [(b'', b'Hello World')]) # Node.js
[
[
(<Status.AC: 'Accepted'>, (b'Hello World\n', b''), 0.05)
],
b''
]
>>>
>>> judge( # Java / OpenJDK
... OpenJDK(), # The default public class name is `Main`
... b'''
... public class Main {
... public static void main(String[] args) {
... System.out.println("Hello, world!");
... }
... }
... ''',
... [
... (b'', b'Hello, world!')
... ]
... )
[
[
(<Status.AC: 'Accepted'>, (b'Hello, world!\n', b''), 0.1)
],
b''
]
License
Licensed under the Apache License, Version 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
dockerjudge-1.2.0.tar.gz
(15.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dockerjudge-1.2.0.tar.gz.
File metadata
- Download URL: dockerjudge-1.2.0.tar.gz
- Upload date:
- Size: 15.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f6242d03ecf4cf1e026af04d67c3a1a6e67c8b3a77e36e32f102553d77e9fbf
|
|
| MD5 |
6c32ded9162300b4d40cc4b145f55034
|
|
| BLAKE2b-256 |
d2c80506883729158a11b32e5c882b49748e3eaff9fa2ef7c56680d6b4b9b44b
|
File details
Details for the file dockerjudge-1.2.0-py3-none-any.whl.
File metadata
- Download URL: dockerjudge-1.2.0-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e7f078001ea578158f387a354be4cb349178ec8dc602647656bda986bf65dd3
|
|
| MD5 |
655b9be3834b8a251f8d319acf07817b
|
|
| BLAKE2b-256 |
981368a93ea7ef4b14494c3a7103d9e8280dc650501224af12038519b60d7001
|