judge_core/judge/
result.rs1use 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 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}