public static bool _Rehack(int id) { Database.DB DbContext = new Database.DB(); var hack = DbContext.Hacks.Find(id); var status = hack.Status; var problem = status.Problem; var contest = problem.Contest; if (status.Result == Entity.JudgeResult.Hacked) { DbContext.TestCases.Remove(status.JudgeTasks.Last().TestCase); DbContext.SaveChanges(); status.Result = status.JudgeTasks.Max(x => x.Result); DbContext.SaveChanges(); } var group = SignalR.JudgeHub.GetNode(); hack.Result = Entity.HackResult.Pending; DbContext.SaveChanges(); if (group == null) { return(false); } SignalR.JudgeHub.context.Clients.Group(group).Hack(new Judge.Models.HackTask(hack)); SignalR.JudgeHub.ThreadBusy(group); hack.Result = Entity.HackResult.Running; DbContext.SaveChanges(); return(true); }
public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest) { if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End) return true; if (string.IsNullOrEmpty(contest.Password)) return true; if (user == null) return false; var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault(); if (joinlog == null) { if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID)) { Database.DB DbContext = new Database.DB(); DbContext.JoinLogs.Add(new Entity.JoinLog { ContestID = contest.ID, UserID = user.ID }); DbContext.SaveChanges(); return true; } else { return false; } } return true; }
public static void ThreadBusy(string JudgerName) { var index = Online.FindIndex(x => x.Username == JudgerName); if (index >= 0) { Online[index].CurrentThreads++; Database.DB DbContext = new Database.DB(); var username = Online[index].Username; var user = (from u in DbContext.Users where u.Username == username select u).Single(); SignalR.CodeCombHub.context.Clients.Group("System Judge").onJudgerStatusChanged(new Models.View.Judger(user, Online[index])); } }
public static void PushToAll(string Message) { Database.DB DbContext = new Database.DB(); var devicetokens = (from dt in DbContext.DeviceTokens where dt.TypeAsInt == (int)Entity.DeviceType.iOS select dt).ToList(); foreach (var dt in devicetokens) { iOS_PushTo(dt.Token, Message); } }
public static void RatingDelete(int id) { var DbContext = new Database.DB(); var old_ratings = (from r in DbContext.Ratings where r.ContestID == id select r).ToList(); foreach (var r in old_ratings) { DbContext.Ratings.Remove(r); } DbContext.SaveChanges(); }
public IActionResult Index() { using (var db = new Database.DB()) { var model = db.Categories.OrderBy(c => c.Name). Select(c => new CategoryModel() { Id = c.Id, Name = c.Name, }) .ToList(); return(base.View(model)); } }
public IActionResult Create(CategoryModel model) { if (ModelState.IsValid) { using (var db = new Database.DB()) { db.Categories.Add(new Database.Categories() { Name = model.Name, }); db.SaveChanges(); } return(RedirectToAction(nameof(Index))); } return(View(model)); }
//contest id public static List<Models.View.Standing> Build(int id) { Database.DB db = new Database.DB(); List<Models.View.Standing> standings = new List<Models.View.Standing>(); var contest = db.Contests.Find(id); var users = (from s in db.Statuses let pid = (from p in db.Problems where p.ContestID == contest.ID select p.ID).ToList() where pid.Contains(s.ProblemID) && s.Time >= contest.Begin && s.Time < contest.End select s.User).Distinct().ToList(); foreach (var user in users) standings.Add(new Models.View.Standing(user, contest)); Sort(contest.Format, ref standings); return standings; }
public static void Update(int user_id,int contest_id, ref List<Models.View.Standing> standings) { Database.DB db = new Database.DB(); var user = db.Users.Find(user_id); var contest = db.Contests.Find(contest_id); var index = standings.FindIndex(x => x.UserID == user_id); var new_standing = new Models.View.Standing(user, contest); if (index < 0) { standings.Add(new_standing); } else { standings[index] = new_standing; } Sort(contest.Format, ref standings); //推送排名变化 SignalR.CodeCombHub.context.Clients.All.onStandingChanged(contest_id, new_standing); }
public static List <Models.View.Standing> Build(int id)//contest id { Database.DB db = new Database.DB(); List <Models.View.Standing> standings = new List <Models.View.Standing>(); var contest = db.Contests.Find(id); var users = (from s in db.Statuses let pid = (from p in db.Problems where p.ContestID == contest.ID select p.ID).ToList() where pid.Contains(s.ProblemID) && s.Time >= contest.Begin && s.Time < contest.End select s.User).Distinct().ToList(); foreach (var user in users) { standings.Add(new Models.View.Standing(user, contest)); } Sort(contest.Format, ref standings); return(standings); }
public static void Update(int user_id, int contest_id, ref List <Models.View.Standing> standings) { Database.DB db = new Database.DB(); var user = db.Users.Find(user_id); var contest = db.Contests.Find(contest_id); var index = standings.FindIndex(x => x.UserID == user_id); var new_standing = new Models.View.Standing(user, contest); if (index < 0) { standings.Add(new_standing); } else { standings[index] = new_standing; } Sort(contest.Format, ref standings); //推送排名变化 SignalR.CodeCombHub.context.Clients.All.onStandingChanged(contest_id, new_standing); }
public Contest(Entity.Contest contest) { ID = contest.ID; Format = contest.Format.ToString(); ProblemCount = contest.Problems.Count; Time = contest.Begin.ToString("yyyy-MM-dd HH:mm"); TimeLength = Helpers.Time.ToVagueTimeLength(contest.Begin, contest.End); Title = HttpUtility.HtmlEncode(contest.Title); Database.DB DbContext = new Database.DB(); UserCount = (from s in DbContext.Statuses let pid = (from p in DbContext.Problems where p.ContestID == contest.ID select p.ID).ToList() where pid.Contains(s.ProblemID) && s.Time >= contest.Begin && s.Time < contest.End select s.UserID).Distinct().Count(); Managers = ""; foreach (var m in contest.Managers) { Managers += String.Format("<a href='/User/{0}'>{1}</a> ", m.UserID, Helpers.ColorName.GetNicknameHtml(m.User.Nickname, m.User.Ratings.Sum(x => x.Credit) + 1500)); } Rating = ""; if (contest.Ready) { Rating = string.Format("<span class='label gray'>评级赛({0}~{1})</span> ", contest.RatingBegin, contest.RatingEnd); } if (string.IsNullOrEmpty(contest.Password)) { Private = false; } else { Private = true; } }
public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest) { if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End) { return(true); } if (string.IsNullOrEmpty(contest.Password)) { return(true); } if (user == null) { return(false); } var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault(); if (joinlog == null) { if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID)) { Database.DB DbContext = new Database.DB(); DbContext.JoinLogs.Add(new Entity.JoinLog { ContestID = contest.ID, UserID = user.ID }); DbContext.SaveChanges(); return(true); } else { return(false); } } return(true); }
public static bool _Rejudge(int id) { Database.DB DbContext = new Database.DB(); var status = DbContext.Statuses.Find(id); var problem = status.Problem; var contest = problem.Contest; List <int> testcase_ids; if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End || contest.Format == Entity.ContestFormat.ACM || contest.Format == Entity.ContestFormat.OPJOI || contest.Format == Entity.ContestFormat.OI) { testcase_ids = (from tc in problem.TestCases where tc.Type != Entity.TestCaseType.Sample orderby tc.Type ascending select tc.ID).ToList(); } else if (contest.Format == Entity.ContestFormat.Codeforces) { testcase_ids = (from tc in problem.TestCases where tc.Type == Entity.TestCaseType.Unilateralism orderby tc.Type ascending select tc.ID).ToList(); var statuses = problem.GetContestStatuses().Where(x => x.UserID == status.UserID).ToList(); foreach (var s in statuses) { foreach (var jt in s.JudgeTasks) { testcase_ids.Add(jt.TestCaseID); } } testcase_ids = testcase_ids.Distinct().ToList(); } else { if (DateTime.Now < contest.RestBegin) { testcase_ids = (from tc in problem.TestCases where tc.Type == Entity.TestCaseType.Sample orderby tc.Type ascending select tc.ID).ToList(); } else { testcase_ids = (from tc in problem.TestCases where tc.Type != Entity.TestCaseType.Sample orderby tc.Type ascending select tc.ID).ToList(); } } var existed_ids = (from jt in status.JudgeTasks select jt.TestCaseID).ToList(); testcase_ids = testcase_ids.Except(existed_ids).ToList(); foreach (var tid in testcase_ids) { DbContext.JudgeTasks.Add(new Entity.JudgeTask { StatusID = status.ID, TestCaseID = tid, Result = Entity.JudgeResult.Pending, MemoryUsage = 0, TimeUsage = 0, Hint = "" }); } DbContext.SaveChanges(); foreach (var jt in status.JudgeTasks) { try { var group = SignalR.JudgeHub.GetNode(); if (group == null) { return(false); } SignalR.JudgeHub.context.Clients.Group(group).Judge(new Judge.Models.JudgeTask(jt)); SignalR.JudgeHub.ThreadBusy(group); jt.Result = Entity.JudgeResult.Running; DbContext.SaveChanges(); } catch { } } SignalR.CodeCombHub.context.Clients.All.onStatusCreated(new Models.View.Status(status));//推送新状态 return(true); }
public StandingCol(Entity.User user, Entity.Problem problem) { var contest = problem.Contest; var statuses = problem.GetContestStatuses().Where(x => x.UserID == user.ID).OrderBy(x=>x.Time).ToList(); #region OI赛制逻辑 if (contest.Format == Entity.ContestFormat.OI) { var status = statuses.LastOrDefault(); if (status == null) { StatusID = null; Css = ""; Display = ""; } else { StatusID = status.ID; var score = status.JudgeTasks.Where(x=>x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count; Display = score.ToString(); if (score == 0) Css = "rank-red"; else if (score != 100) Css = "rank-orange"; else Css = "rank-green"; Key1 = score; Key2 = status.JudgeTasks.Sum(x => x.TimeUsage); Key3 = status.JudgeTasks.Sum(x => x.MemoryUsage); } } #endregion #region OPJOI赛制逻辑 else if (contest.Format == Entity.ContestFormat.OPJOI) { var status = statuses.LastOrDefault(); if (status == null) { StatusID = null; Css = ""; Display = ""; } else { StatusID = status.ID; var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count; Display = score.ToString() + "(" + statuses.Count + ")"; if (score == 0) Css = "rank-red"; else if (score != 100) Css = "rank-orange"; else Css = "rank-green"; Key1 = score; Key2 = statuses.Count; Key3 = status.JudgeTasks.Sum(x => x.TimeUsage); } } #endregion #region ACM赛制逻辑 else if (contest.Format == Entity.ContestFormat.ACM) { if (statuses.Count == 0) { StatusID = null; Css = ""; Display = ""; } else { var status = statuses.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).FirstOrDefault(); var penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count(); if (status == null) { Display = "(-" + penalty_count + ")"; Css = "rank-red"; StatusID = null; Key1 = 0; Key2 = 0; Key3 = penalty_count; } else { Css = "rank-green"; StatusID = status.ID; penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt) && x.Time < status.Time).Count(); var penalty_time = (status.Time - status.Problem.Contest.Begin).Add(new TimeSpan(0, 20 * penalty_count, 0)); Display = penalty_time.ToString("c"); if (penalty_count > 0) Display += "<br/>(-" + penalty_count + ")"; StatusID = status.ID; Key1 = 1; Key2 = (int)penalty_time.TotalSeconds; Key3 = penalty_count; } } } #endregion #region CF、TC赛制逻辑 else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder) { Database.DB db = new Database.DB(); var hack_success = (from h in db.Hacks where h.Status.ProblemID == problem.ID && h.HackerID == user.ID && h.ResultAsInt == (int)Entity.HackResult.Success select h).Count(); var hack_failed = (from h in db.Hacks where h.Status.ProblemID == problem.ID && h.HackerID == user.ID && h.ResultAsInt == (int)Entity.HackResult.Failure select h).Count(); Key2 = hack_success; Key3 = hack_failed; if (statuses.Count == 0) { StatusID = null; Css = ""; Display = ""; } else { var status = statuses.Last(); if (status.Result == Entity.JudgeResult.Accepted) { var max = problem.Credit; var score = 0; TimeSpan time; if (contest.Format == Entity.ContestFormat.Codeforces) { score = Convert.ToInt32(max * (1 - 0.004 * (status.Time - problem.Contest.Begin).TotalMinutes)); time = status.Time - contest.Begin; } else { var glance = (from g in problem.Glances where g.UserID == user.ID select g).SingleOrDefault(); score = Convert.ToInt32(max * (1 * 0.004 * (status.Time - glance.Time).TotalMinutes)); time = status.Time - glance.Time; } score -= 50 * statuses.Where(x => !Entity.Status._FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count(); if (score < max * 0.3) score = Convert.ToInt32(max * 0.3); Key1 = score; Css = "rank-green"; Display = Key1 + "<br/>(" + time.ToString("hh':'mm") + ")"; StatusID = status.ID; } else { Css = "rank-red"; Display = "(-" + statuses.Count + ")"; } } } #endregion #region CC赛制逻辑 else//未实现 { } #endregion }
public StandingCol(Entity.User user, Entity.Problem problem) { var contest = problem.Contest; var statuses = problem.GetContestStatuses().Where(x => x.UserID == user.ID).OrderBy(x => x.Time).ToList(); #region OI赛制逻辑 if (contest.Format == Entity.ContestFormat.OI) { var status = statuses.LastOrDefault(); if (status == null) { StatusID = null; Css = ""; Display = ""; } else { StatusID = status.ID; var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count; Display = score.ToString(); if (score == 0) { Css = "rank-red"; } else if (score != 100) { Css = "rank-orange"; } else { Css = "rank-green"; } Key1 = score; Key2 = status.JudgeTasks.Sum(x => x.TimeUsage); Key3 = status.JudgeTasks.Sum(x => x.MemoryUsage); } } #endregion #region OPJOI赛制逻辑 else if (contest.Format == Entity.ContestFormat.OPJOI) { var status = statuses.LastOrDefault(); if (status == null) { StatusID = null; Css = ""; Display = ""; } else { StatusID = status.ID; var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count; Display = score.ToString() + "(" + statuses.Count + ")"; if (score == 0) { Css = "rank-red"; } else if (score != 100) { Css = "rank-orange"; } else { Css = "rank-green"; } Key1 = score; Key2 = statuses.Count; Key3 = status.JudgeTasks.Sum(x => x.TimeUsage); } } #endregion #region ACM赛制逻辑 else if (contest.Format == Entity.ContestFormat.ACM) { if (statuses.Count == 0) { StatusID = null; Css = ""; Display = ""; } else { var status = statuses.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).FirstOrDefault(); var penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count(); if (status == null) { Display = "(-" + penalty_count + ")"; Css = "rank-red"; StatusID = null; Key1 = 0; Key2 = 0; Key3 = penalty_count; } else { Css = "rank-green"; StatusID = status.ID; penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt) && x.Time < status.Time).Count(); var penalty_time = (status.Time - status.Problem.Contest.Begin).Add(new TimeSpan(0, 20 * penalty_count, 0)); Display = penalty_time.ToString("c"); if (penalty_count > 0) { Display += "<br/>(-" + penalty_count + ")"; } StatusID = status.ID; Key1 = 1; Key2 = (int)penalty_time.TotalSeconds; Key3 = penalty_count; } } } #endregion #region CF、TC赛制逻辑 else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder) { Database.DB db = new Database.DB(); var hack_success = (from h in db.Hacks where h.Status.ProblemID == problem.ID && h.HackerID == user.ID && h.ResultAsInt == (int)Entity.HackResult.Success select h).Count(); var hack_failed = (from h in db.Hacks where h.Status.ProblemID == problem.ID && h.HackerID == user.ID && h.ResultAsInt == (int)Entity.HackResult.Failure select h).Count(); Key2 = hack_success; Key3 = hack_failed; if (statuses.Count == 0) { StatusID = null; Css = ""; Display = ""; } else { var status = statuses.Last(); if (status.Result == Entity.JudgeResult.Accepted) { var max = problem.Credit; var score = 0; TimeSpan time; if (contest.Format == Entity.ContestFormat.Codeforces) { score = Convert.ToInt32(max * (1 - 0.004 * (status.Time - problem.Contest.Begin).TotalMinutes)); time = status.Time - contest.Begin; } else { var glance = (from g in problem.Glances where g.UserID == user.ID select g).SingleOrDefault(); score = Convert.ToInt32(max * (1 * 0.004 * (status.Time - glance.Time).TotalMinutes)); time = status.Time - glance.Time; } score -= 50 * statuses.Where(x => !Entity.Status._FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count(); if (score < max * 0.3) { score = Convert.ToInt32(max * 0.3); } Key1 = score; Css = "rank-green"; Display = Key1 + "<br/>(" + time.ToString("hh':'mm") + ")"; StatusID = status.ID; } else { Css = "rank-red"; Display = "(-" + statuses.Count + ")"; } } } #endregion #region CC赛制逻辑 else//未实现 { } #endregion }
public static void RatingCount(int id)//contest_id { RatingDelete(id); #region 初始化 var DbContext = new Database.DB(); var contest = DbContext.Contests.Find(id); var statuses = (from s in DbContext.Statuses where s.Problem.ContestID == contest.ID select s).ToList(); var ranklist = Helpers.Standings.Build(id); var problems = contest.Problems.OrderBy(x => x.Credit).ToList(); #endregion for (int i = 0; i < ranklist.Count; i++) { var user_credits = 0; #region 计算排名分 (-15 ~ 15) var pts = ranklist.Count / 2 - i; if (pts > 15) { pts = 15; } if (pts < -15) { pts = -15; } user_credits += pts - i; #endregion var num = 0; foreach (var detail in ranklist[i].Details) { var problem_ratings = problems[num].Difficulty; var user = DbContext.Users.Find(ranklist[i].UserID); var user_ratings = user.Ratings.Sum(x => x.Credit) + 1500; var extend_pts = (problem_ratings - user_ratings) / 300.0; if (extend_pts > 1) { extend_pts = 1; } if (extend_pts < -1) { extend_pts = -1; } #region ACM赛制 if (contest.Format == Entity.ContestFormat.ACM) { var base_pts = 10; base_pts -= detail.Key3; if (base_pts < 0) { base_pts = 0; } if (detail.Key1 == 1) { user_credits += base_pts + (int)(Math.Floor((extend_pts + 1) * 25)); } else { user_credits += (int)(Math.Floor((extend_pts - 1) * 25)); } } #endregion #region OI赛制 else if (contest.Format == Entity.ContestFormat.OI) { if (detail.Key1 > 50) { user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0)); } else { user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0); } } #endregion #region OPJOI赛制 else if (contest.Format == Entity.ContestFormat.OPJOI) { var base_pts = 10; base_pts -= detail.Key2 + 1; if (base_pts < 0) { base_pts = 0; } if (detail.Key1 > 50) { user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0)); } else { user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0); } } #endregion #region CF、TC赛制 else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder) { var base_pts = (int)Math.Floor(detail.Key2 - (detail.Key3 / 2.0)); if (base_pts > 10) { base_pts = 10; } if (base_pts < -5) { base_pts = -5; } if (base_pts < 0) { base_pts = 0; } if (detail.Key1 > 0) { user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 30)) * (problems[num].Credit - detail.Key1)); } else { user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 25))); } } #endregion num++; } DbContext.Ratings.Add(new Entity.Rating { Credit = user_credits, ContestID = id, Time = contest.End, UserID = ranklist[i].UserID }); DbContext.SaveChanges(); } }