DMOJ Judge |Linux Build Status| |Windows Build Status| |FreeBSD Build Status| |Coverage| |Documentation Status| |Slack|
=======================================================================================================================

Python `AGPLv3 <https://github.com/DMOJ/judge/blob/master/LICENSE>`__ contest judge backend for the `DMOJ site <http://github.com/DMOJ/site>`__ interface. See it in action at `dmoj.ca <https://dmoj.ca/>`__!

+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| |image6|   | A modern online judge and contest platform system, supporting **IO-based**, **interactive**, and **signature-graded** tasks, with **runtime data generators** and **custom output validators**.   |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Supported Platforms and Runtimes
--------------------------------

The judge implements secure grading on Linux, Windows, and FreeBSD machines.

+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+
|                                                                             | Linux                                                                       | Windows                                                                     | FreeBSD                                                                     |
+=============================================================================+=============================================================================+=============================================================================+=============================================================================+
| x64                                                                         | `✔ <https://travis-ci.org/DMOJ/judge>`__                                    | `✔ <https://ci.appveyor.com/project/quantum5/judge>`__                      | `✔ <https://ci.dmoj.ca/job/dmoj-judge-freebsd/>`__                          |
+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| x86                                                                         | ✔                                                                           | ✔                                                                           | ¯\\\_(ツ)\_/¯                                                               |
+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| x32                                                                         | ✔                                                                           | —                                                                           | —                                                                           |
+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| ARM                                                                         | ✔                                                                           | —                                                                           | X                                                                           |
+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------+

The DMOJ judge does **not** need a root user to run on Linux machines: it will run just fine under a normal user.

Supported languages include:

-  C++ 0x/11/14/17 (GCC and Clang)
-  C 99/11
-  Java 7/8/9/10
-  Python 2/3
-  PyPy 2/3
-  Pascal
-  Perl
-  Mono C#/F#/VB

The following runtimes are also supported, but only on Windows machines:

-  Visual C++
-  C#
-  F#
-  VB.NET

The judge can also grade in the languages listed below. These languages are less tested and more likely to be buggy.

-  Ada
-  AWK
-  Clozure Common Lisp
-  COBOL
-  D
-  Dart
-  Fortran
-  Forth
-  Go
-  Groovy
-  Haskell
-  INTERCAL
-  Kotlin
-  Lua
-  NASM
-  Nim
-  Objective-C
-  Octave
-  OCaml
-  PHP 5/7
-  Pike
-  Prolog
-  Racket
-  Ruby 2.1
-  Rust
-  Scala
-  Chicken Scheme
-  sed
-  Steel Bank Common Lisp
-  Swift
-  Tcl
-  Turing
-  V8 JavaScript
-  Brain\*\*\*\*

Installation
------------

| Installing the DMOJ judge creates two executables in your Python's script directory: ``dmoj`` and ``dmoj-cli``.
| ``dmoj`` is used to connect a judge to a DMOJ site instance, while ``dmoj-cli`` provides a command-line interface to a
| local judge, useful for testing problems.

For more detailed steps, read the `Linux Installation <https://docs.dmoj.ca/en/latest/judge/linux_installation/>`__ or `Windows Installation <https://docs.dmoj.ca/en/latest/judge/windows_installation/>`__ instructions.

Stable Build
~~~~~~~~~~~~

| |PyPI version|
| |PyPI|

| We periodically publish builds `on PyPI <https://pypi.python.org/pypi/dmoj>`__. This is the easiest way to get started,
| but may not contain all the latest features and improvements.

::

    $ pip install dmoj

Bleeding-Edge Build
~~~~~~~~~~~~~~~~~~~

This is the version of the codebase we run live on `dmoj.ca <https://dmoj.ca>`__.

::

    $ git clone https://github.com/DMOJ/judge.git
    $ cd judge
    $ git submodule update --init --recursive
    $ pip install -e .

Usage
-----

Running a Judge Server
~~~~~~~~~~~~~~~~~~~~~~

::

    $ dmoj --help
    usage: dmoj [-h] [-p SERVER_PORT] -c CONFIG [-l LOG_FILE]
                [-e ONLY_EXECUTORS | -x EXCLUDE_EXECUTORS] [--no-ansi]
                server_host [judge_name] [judge_key]

    Spawns a judge for a submission server.

    positional arguments:
      server_host           host to listen for the server
      judge_name            judge name (overrides configuration)
      judge_key             judge key (overrides configuration)

    optional arguments:
      -h, --help            show this help message and exit
      -p SERVER_PORT, --server-port SERVER_PORT
                            port to listen for the server
      -c CONFIG, --config CONFIG
                            file to load judge configurations from
      -l LOG_FILE, --log-file LOG_FILE
                            log file to use
      -e ONLY_EXECUTORS, --only-executors ONLY_EXECUTORS
                            only listed executors will be loaded (comma-separated)
      -x EXCLUDE_EXECUTORS, --exclude-executors EXCLUDE_EXECUTORS
                            prevent listed executors from loading (comma-
                            separated)
      --no-ansi             disable ANSI output

Running a CLI Judge
~~~~~~~~~~~~~~~~~~~

::

    $ dmoj-cli --help
    usage: dmoj-cli [-h] -c CONFIG
                    [-e ONLY_EXECUTORS | -x EXCLUDE_EXECUTORS]
                    [--no-ansi] [--no-ansi-emu]

    Spawns a judge for a submission server.

    optional arguments:
      -h, --help            show this help message and exit
      -c CONFIG, --config CONFIG
                            file to load judge configurations from
      -e ONLY_EXECUTORS, --only-executors ONLY_EXECUTORS
                            only listed executors will be loaded (comma-separated)
      -x EXCLUDE_EXECUTORS, --exclude-executors EXCLUDE_EXECUTORS
                            prevent listed executors from loading (comma-
                            separated)
      --no-ansi             disable ANSI output
      --no-ansi-emu         disable ANSI emulation on Windows

Documentation
-------------

For info on the problem file format and more, `read the documentation. <https://docs.dmoj.ca>`__

.. |Linux Build Status| image:: https://img.shields.io/travis/DMOJ/judge.svg?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxODguMSAxOTUuNSI% %2BPC9zdmc%2B
   :target: https://travis-ci.org/DMOJ/judge
.. |Windows Build Status| image:: https://ci.appveyor.com/api/projects/status/wv4e1eujb6wtcbps?svg=true
   :target: https://ci.appveyor.com/project/quantum5/judge
.. |FreeBSD Build Status| image:: https://img.shields.io/jenkins/s/https/ci.dmoj.ca/job/dmoj-judge-freebsd.svg?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNTYgMjUyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj48ZyBmaWxsPSJ3aGl0ZSI% %2BPC9zdmc%2B
   :target: https://ci.dmoj.ca/job/dmoj-judge-freebsd/lastBuild/consoleFull
.. |Coverage| image:: https://img.shields.io/codecov/c/github/DMOJ/judge.svg
   :target: https://codecov.io/gh/DMOJ/judge
.. |Documentation Status| image:: https://readthedocs.org/projects/dmoj/badge/?version=latest
   :target: https://docs.dmoj.ca
.. |Slack| image:: https://slack.dmoj.ca/badge.svg
   :target: https://slack.dmoj.ca
.. |image6| image:: https://avatars2.githubusercontent.com/u/6934864?v=3&s=100
   :target: http://dmoj.ca
.. |PyPI version| image:: https://badge.fury.io/py/dmoj.svg
   :target: https://pypi.python.org/pypi/dmoj
.. |PyPI| image:: https://img.shields.io/pypi/pyversions/dmoj.svg
   :target: https://pypi.python.org/pypi/dmoj
