judge_core/judge/
result.rs

1use crate::run::sandbox::RawRunResultInfo;
2use std::{fmt, ops::Add, time::Duration};
3
4#[derive(Debug)]
5pub struct JudgeResultInfo {
6    pub verdict: JudgeVerdict,
7    pub time_usage: Duration,
8    pub memory_usage_bytes: i64,
9    pub exit_status: i32,
10    pub checker_exit_status: i32,
11}
12
13#[derive(Debug, PartialEq)]
14pub enum JudgeVerdict {
15    Accepted,
16    WrongAnswer,
17    TimeLimitExceeded,
18    IdlenessLimitExceeded,
19    RuntimeError,
20    PartialScore,
21    SystemError,
22}
23
24impl fmt::Display for JudgeVerdict {
25    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
26        write!(f, "{:?}", self)
27    }
28}
29
30pub fn get_run_time(raw_info: &RawRunResultInfo) -> Duration {
31    let rusage = &raw_info.resource_usage;
32    let utime = rusage.user_time;
33    let stime = rusage.system_time;
34    utime.add(stime)
35}
36
37pub fn get_max_mem(raw_info: &RawRunResultInfo) -> i64 {
38    let rusage = &raw_info.resource_usage;
39    rusage.max_rss
40}
41
42pub fn check_user_result(raw_info: &RawRunResultInfo) -> Option<JudgeVerdict> {
43    let exit_status = raw_info.exit_status;
44    log::debug!("User program exit status: {}", exit_status);
45    match exit_status {
46        0 => None,
47        11 => Some(JudgeVerdict::RuntimeError),
48        152 => Some(JudgeVerdict::TimeLimitExceeded),
49        _ => Some(JudgeVerdict::SystemError),
50    }
51}
52
53pub fn check_checker_result(raw_info: &RawRunResultInfo) -> JudgeVerdict {
54    // TODO: return verdict according to the checker output
55    let exit_status = raw_info.exit_status;
56    log::debug!("Checker program exit status: {}", exit_status);
57    match exit_status {
58        0 => JudgeVerdict::Accepted,
59        256 => JudgeVerdict::WrongAnswer,
60        _ => JudgeVerdict::SystemError,
61    }
62}