The project is a tool written in C++ to judge a program for Hydrogen OJ.
Add swapaccount=1
to GRUB_CMDLINE_LINUX
in /etc/default/grub
.
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Then run command below:
update-grub && reboot
Requirement: Yarn
yarn add hoj-judger
Requirement: CMake 3.4 or higher, g++ 9 or higher
./build.sh
hoj-judger --source=<source-file> --problem=<data-dir> --language=<language> --checker=<checker-path> --output=<output-dir>
Here is the description for each argument.
Argument | Description | Example |
---|---|---|
source | Path to source file. | test/aplusb_problem/src.cpp |
problem | Path to problem directory which contains *.in/*.out and config.yml. | test/aplusb_problem/data |
language | Language identifier defined in the config. | cpp98 |
checker | Path to checker. | node/bin/hoj-checker |
output | Path to output directory. | test/aplusb_problem |
In the output directory, hoj-judger will create exe
, output.out
, compile.log
and result.yml
while running. If chosen language doesn't need to be compiled, it will only create output.out
and result.yaml
. For details of result.yaml
, see below.
const HojJudger = require('../node/index');
HojJudger.judge({
code_path: './test/aplusb_problem/src.cpp',
problem_path: './test/aplusb_problem/data',
output_path: './test/aplusb_problem/',
language: 'cpp98'
}).then(result => {
console.log(result);
});
Also support TypeScript.
Path: /path/to/work/directory/hoj-judger-config.yml
language:
cpp98: # This is an identifier for a language.
compile: "g++ \"%source\" -o \"%executable\" -DONLINE_JUDGE -DHOJ_JUDGER" # This is a command for COMPILE event.
run: "\"%executable\"" # This is a command for RUN event.
nodejs:
run: "node \"%executable\""
Here is the description for each variable.
Variable | Description | Example |
---|---|---|
source | Path to source file. | ./test/aplusb_problem/src.cpp |
executable | Path to executable file. | ./test/aplusb_problem/exe |
If any language doesn't need to be compiled, compile
can be ignored. But run
is always required.
Path: /path/to/problem/data/config.yml
file: aplusb # Prefix of each input and output file.
mode: oi # It can only be filled with "oi" now.
type: default # It can only be filled with "default" now.
case_count: 2 # Count of test cases.
case:
- space: 131072 # Maximum space limit (KiB).
time: 1000 # Maximum time limit (ms).
score: 50 # Score of the test case.
- space: 131072
time: 1000
score: 50
Each data file should be named like aplusb1.in
, aplusb1.out
. If file
is ignored, the data file name should be named like 1.in
, 1.out
.
Path: /path/to/output/directory/result.yml
score: 10 # Total score.
time: 299 # Total time (ms).
space: 1612 # Maximum used space (KiB).
status: 4 # Judge status.
case_count: 2 # Count of test cases.
case:
- space: 1612 # Used space (KiB).
time: 27 # Used time (ms).
score: 0 # Score.
status: 12 # Test case status.
- space: 1604
time: 26
score: 50
status: 1
Here is the description for judge status.
Status | Abbr. | Value | Description |
---|---|---|---|
NO_STATUS | / | 0 | Unused status. |
ACCEPTED | AC | 1 | Accepted. |
COMPILE_ERROR | CE | 2 | Compile error. |
SYSTEM_ERROR | SE | 3 | System error. |
UNACCEPTED | WA | 4 | Unaccepted. |
UNKNOWN_ERROR | UKE | 5 | Unknown error. |
Here is the description for test case status.
Status | Abbr. | Value | Description |
---|---|---|---|
NO_STATUS | / | 0 | Unused status. |
ACCEPTED | AC | 1 | Accepted. |
COMPILE_ERROR | CE | 2 | Compile error. |
COMPILE_MEMORY_LIMIT_EXCEEDED | CMLE | 3 | Compile memory limit exceeded. |
COMPILE_TIME_LIMIT_EXCEEDED | CTLE | 4 | Compile time limit exceeded. |
MEMORY_LIMIT_EXCEEDED | MLE | 5 | Memory limit exceeded. |
OUTPUT_LIMIT_EXCEEDED | OLE | 6 | Output limit exceeded. |
PRESENTATION_ERROR | PE | 7 | Presentation error. |
RUNTIME_ERROR | RE | 8 | Runtime error. |
SYSTEM_ERROR | SE | 9 | System error. |
TIME_LIMIT_EXCEEDED | TLE | 10 | Time limit exceeded. |
UNKNOWN_ERROR | UKE | 11 | Unknown error. |
WRONG_ANSWER | WA | 12 | Wrong answer. |