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
: outputjudge_output
: đáp ánsubmission_source
: Code bài nộpjudge_input
: inputpoint_value
: điểm của test đang chấmcase_position
: thứ tự của testsubmission_language
: ngôn ngữ của bài nộpexecution_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]
./main [input_file] [output_file] [ans_file]
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\) và \(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
}
}