6 releases

0.4.0 May 6, 2021
0.3.2 Mar 16, 2021
0.3.1 Aug 18, 2020
0.3.0 Jul 21, 2020
0.2.2 May 19, 2020

#1 in #judge

MIT license

34KB
896 lines

ojcmp

Crates.io MIT licensed CI

online judge comparer

Status

Maintaining 0.4.0

Install

cargo install ojcmp

Build

cargo build --release

Install by cargo

cargo install --path .

Install manually

cp target/release/ojcmp /usr/bin

Usage

ojcmp 0.4.0
Nugine <nugine@foxmail.com>

USAGE:
    ojcmp <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    float     Float compare
    help      Prints this message or the help of the given subcommand(s)
    normal    Normal compare
    strict    Strict compare
ojcmp-normal 0.4.0
Normal compare

USAGE:
    ojcmp normal [FLAGS] [OPTIONS] <--std <path>|--std-fd <fd>> <--user <path>|--user-fd <fd>>

FLAGS:
    -h, --help        Prints help information
    -q, --quiet       No output printed to stdout or stderr
    -a, --read-all    Reads all bytes of user file even if it's already WA
    -V, --version     Prints version information

OPTIONS:
    -b, --buffer-size <bytes>    Buffer size (in bytes) for both std and user file [default: 65536]
    -s, --std <path>             Std file path
        --std-fd <fd>            Std file descriptor
    -u, --user <path>            User file path
        --user-fd <fd>           User file descriptor

Return Value

type value
exit_code (AC) 0
exit_code (WA) 1
exit_code (PE) 2
exit_code (error) 101
stdout "AC" / "WA" / "PE"
stderr error message

Current Implementation

Mode: Normal

trim_end(file)

judge!(AC, b"1\r\n\r\n\r\n", b"1  ");

for each line, trim_end(line)

judge!(AC, b"1 \n", b"1");

for each line, check spaces between non-space chars

judge!(PE, b"1 3\n", b"1         3\n");

Mode: Strict

User file must have the same bytes with std file.

The two byte streams must be exactly the same.

There is no "PE" in this mode.

Mode: Float

Compare two streams of float numbers which are splitted by ascii whitespaces.

Parse any float number as f64 (aka double in C language).

Ascii whitespaces between two float numbers are considered as a single separator symbol.

Use CLI option --eps to specify eps value, for example --eps 1e-3.

There is no "PE" in this mode.

Change Log

  • v0.4.0 Allow passing file fd. Change return value to indicate comparison result.
  • v0.3.2 Fix unsoundness in ByteReader.
  • v0.3.1 Fix performance regression since v0.2.0. Allow unsafe code.
  • v0.3.0 Forbid unsafe code. Use subcommands for different modes.
  • v0.2.2 Fix bug in nan handling. (yank v0.2.1)
  • v0.2.1 Add spj_float mode. (yanked)
  • v0.2.0 Add strict mode. No break changes.
  • v0.1.3 No functional changes
  • v0.1.2 Fix algorithm bug
  • v0.1.1 Use unsafe static buffer

Dependencies

~3MB
~53K SLoC