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;
        }
Exemple #3
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();
        }
Exemple #4
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 && 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();
        }