Custom Checker Sample

Custom checker (PY)

Đây là checker mặc định của website, cho phép người dùng cập nhật được nhiều thông tin nhất (chi tiết xem ở bên dưới). Chúng ta cần hoàn thành hàm check dưới đây:

def check(process_output, judge_output, **kwargs):
    # return True/False

Trong đó, **kwargs có thể chứa các biến sau:

  • process_output: output
  • judge_output: đáp án
  • submission_source: Code bài nộp
  • judge_input: input
  • point_value: điểm của test đang chấm
  • case_position: thứ tự của test
  • submission_language: ngôn ngữ của bài nộp
  • execution_time: thời gian chạy

Return:

  • Cách 1: Trả về True/False
  • Cách 2: Trả về một object CheckerResult có thể được gọi như sau
CheckerResult(case_passed_bool, points_awarded, feedback='')

Ví dụ

Dưới đây là ví dụ cho bài toán: Input gồm 1 số nguyên ~n~. In ra 2 số nguyên ~a, b~ sao cho ~a + b = n~.

from dmoj.result import CheckerResult


def wa(feedback):
    return CheckerResult(False, 0, feedback)


def check(process_output, judge_output, judge_input, **kwargs):
    # process the input
    input_arr = judge_input.split()
    assert(len(input_arr) == 1)
    n = int(input_arr[0])

    #  process the contestant's output
    output_arr = process_output.split()

    if (len(output_arr) != 2):
        return wa('Wrong output format')

    try:
        a, b = int(output_arr[0]), int(output_arr[1])
    except:
        return wa('Wrong output format')

    if (n == a + b):
        return True
    return wa('a + b != n')

Custom checker (CPP)

Để sử dụng chức năng này, cần viết một chương trình C++ pass vào 3 arguments theo thứ tự input_file, output_file, ans_file tương ứng với các file input, output, đáp án.

Để test chương trình trên máy tính, có thể dùng lệnh như sau (Windows):

main.exe [input_file] [output_file] [ans_file]
hoặc trên Linux/Mac OS:
./main [input_file] [output_file] [ans_file]
Return:

Chương trình trả về giá trị:

  • 0 nếu AC (100% điểm)
  • 1 nếu WA (0 điểm)
  • 2 nếu điểm thành phần. Khi đó cần in ra stderr một số thực trong đoạn [0, 1] thể hiện cho tỷ lệ điểm. Nếu điểm < 1 thì hiển thị WA, điểm = 1 thì hiển thị AC.

Những thông tin được viết ra stdout (bằng cout) sẽ được in ra màn hình cho người nộp bài(feedback)

Ví dụ:

Chương trình sau dùng để chấm bài toán: Cho \(n\) là một số nguyên dương. In ra hai số tự nhiên \(a, b\) sao cho \(a + b = n\).

Nếu in ra \(a + b = n\)\(a, b \geq 0\) thì được 100% số điểm, nếu \(a + b = n\) nhưng một trong 2 số \(a, b\) âm thì được 50% số điểm.

#include <bits/stdc++.h>
using namespace std;

int main(int argc, char** argv) {
    ifstream inp(argv[1]);
    ifstream out(argv[2]);
    ifstream ans(argv[3]);

    int n, a, b, c, d;

    inp >> n;
    out >> a >> b;
    ans >> c >> d;

    if (a + b == c + d) {
        cout << a << " + " << b << " = " << c << " + " << d << endl;

        if (a >= 0 && b >= 0) {
            return 0; // AC
        }
        else {
            cerr << "points " << 0.5;
            return 2; // PARTIAL
        }
    }     
    else {
        cout << "a + b = " << a + b << " != " << n << endl;
        return 1; // WA
    }
}