public override void OnJudgeCompleted(JudgeStatus status) { var attendee = DB.Attendees .Single(x => x.ContestId == status.ContestId && x.UserId == status.UserId); var cpls = DB.ContestProblemLastStatuses .Include(x => x.Status) .SingleOrDefault(x => x.ProblemId == status.ProblemId && x.UserId == status.UserId && x.ContestId == status.ContestId); var contestProblem = DB.ContestProblems.Single(x => x.ContestId == status.ContestId && x.ProblemId == status.ProblemId); var duration = ComputeTimeSpan(status.CreatedTime, status.UserId); var validTestCases = GetValidTestCasesAsync(status.ProblemId, status.UserId, default(CancellationToken)).Result; bool isHackable = false; if (validTestCases.Count() == 0) { isHackable = true; } else { isHackable = status.SubStatuses.Where(x => validTestCases.Contains(x.TestCaseId.Value)).Select(x => x.Result).Max() == JudgeResult.Accepted; } if (cpls == null) { cpls = new ContestProblemLastStatus { ProblemId = status.ProblemId, ContestId = status.ContestId, UserId = status.UserId, StatusId = status.Id, Point = status.Result == JudgeResult.Accepted ? CaculatePoint(contestProblem.Point, duration, 1) : 0, Point2 = 0, Point3 = 0, Point4 = 1, TimeSpan = duration, IsAccepted = status.Result == JudgeResult.Accepted, IsVirtual = attendee.IsVirtual, IsHackable = isHackable }; DB.ContestProblemLastStatuses.Add(cpls); } else { cpls.StatusId = status.Id; cpls.Point4++; cpls.Point = status.Result == JudgeResult.Accepted ? CaculatePoint(contestProblem.Point, ComputeTimeSpan(status.CreatedTime, status.UserId), cpls.Point4) : 0; cpls.TimeSpan = duration; cpls.IsAccepted = status.Result == JudgeResult.Accepted; cpls.IsHackable = isHackable; cpls.IsHacked = isHackable ? false : cpls.IsHacked; } DB.SaveChanges(); }
private async Task FilterCplsAsync(ContestProblemLastStatus cpls, IDictionary <string, ContestProblem> contestProblems, CancellationToken token) { var validTestCases = (await GetValidTestCasesAsync(cpls.ProblemId, cpls.UserId, token)).ToList(); cpls.Status.SubStatuses = cpls.Status.SubStatuses .Where(x => x.TestCaseId.HasValue && validTestCases.Contains(x.TestCaseId.Value)) .ToList(); cpls.Status.Result = cpls.Status.SubStatuses.Max(x => x.Result); cpls.IsAccepted = cpls.Status.Result == JudgeResult.Accepted; cpls.Point = cpls.IsAccepted ? CaculatePoint(contestProblems[cpls.ProblemId].Point, ComputeTimeSpan(cpls.Status.CreatedTime, cpls.UserId), cpls.Point4) : 0; }
public override void OnJudgeCompleted(JudgeStatus status) { var attendee = DB.Attendees .Single(x => x.ContestId == status.ContestId && x.UserId == status.UserId); var cpls = DB.ContestProblemLastStatuses .Include(x => x.Status) .SingleOrDefault(x => x.ProblemId == status.ProblemId && x.UserId == status.UserId && x.ContestId == status.ContestId); if (cpls != null && cpls.Status.Result == JudgeResult.Accepted || status.Result == JudgeResult.CompileError || status.Result == JudgeResult.SystemError) { return; } var contestProblem = DB.ContestProblems.Single(x => x.ContestId == status.ContestId && x.ProblemId == status.ProblemId); if (cpls == null) { cpls = new ContestProblemLastStatus { ProblemId = status.ProblemId, ContestId = status.ContestId, UserId = status.UserId, StatusId = status.Id, Point = status.Result == JudgeResult.Accepted ? 1 : 0, Point3 = status.Result == JudgeResult.Accepted ? 0 : 1, TimeSpan = status.Result == JudgeResult.Accepted ? ComputeTimeSpan(status.CreatedTime, status.UserId) : default(TimeSpan), IsAccepted = status.Result == JudgeResult.Accepted, IsVirtual = attendee.IsVirtual }; DB.ContestProblemLastStatuses.Add(cpls); } else { cpls.StatusId = status.Id; cpls.Point = status.Result == JudgeResult.Accepted ? 1 : 0; cpls.Point3 += status.Result == JudgeResult.Accepted ? 0 : 1; cpls.TimeSpan = status.Result == JudgeResult.Accepted ? ComputeTimeSpan(status.CreatedTime, status.UserId).Add(new TimeSpan(0, 20 * cpls.Point3, 0)) : default(TimeSpan); cpls.IsAccepted = status.Result == JudgeResult.Accepted; } DB.SaveChanges(); }
public override void OnJudgeCompleted(JudgeStatus status) { var attendee = DB.Attendees .Single(x => x.ContestId == status.ContestId && x.UserId == status.UserId); var cpls = DB.ContestProblemLastStatuses .Include(x => x.Status) .SingleOrDefault(x => x.ProblemId == status.ProblemId && x.UserId == status.UserId && x.ContestId == status.ContestId); if (cpls != null && status.CreatedTime <= cpls.Status.CreatedTime) { return; } var contestProblem = DB.ContestProblems.Single(x => x.ContestId == status.ContestId && x.ProblemId == status.ProblemId); if (cpls == null) { cpls = new ContestProblemLastStatus { ProblemId = status.ProblemId, ContestId = status.ContestId, UserId = status.UserId, StatusId = status.Id, Point = status.SubStatuses == null ? 0 : status.SubStatuses.Count(x => x.Result == JudgeResult.Accepted) * contestProblem.Point / status.SubStatuses.Count, Point3 = 1, IsAccepted = status.Result == JudgeResult.Accepted, IsVirtual = attendee.IsVirtual }; DB.ContestProblemLastStatuses.Add(cpls); } else { cpls.StatusId = status.Id; cpls.Point = status.SubStatuses == null ? 0 : status.SubStatuses.Count(x => x.Result == JudgeResult.Accepted) * contestProblem.Point / status.SubStatuses.Count; cpls.Point3++; cpls.IsAccepted = status.Result == JudgeResult.Accepted; } DB.SaveChanges(); }