注册
6 | 7 |没什么可给你,但求凭这阙歌。谢谢你风雨里,都不退愿陪着我。
9 |{{problem.title}}{% if not problem.is_public %}--[未审核]{% endif %}
14 | 15 |16 | 内存限制: {{problem.memory_limit}} MB 17 | 时间限制: {{problem.time_limit}} ms 18 |
19 |题目描述
输入格式
输出格式
测试样例
数据范围与提示
修改资料
6 |修改成功
10 | {% elif status==3001 %} 11 |邮箱格式错误
12 | {% elif status==3002 %} 13 |原密码错误...不要偷偷改别人密码哦
14 | {% elif status==3003%} 15 |新密码不得为空
16 | {% else %} 17 |未知状态
18 | {% endif %} 19 |修改题目
15 | {% else %} 16 | {% set problem_id=0 %} 17 |上传题目
18 | {% endif %} 19 | 83 |>>29;return w};var b=function(r){var q="",o="",s,p;for(p=0;p<=3;p++){s=(r>>>(p*8))&255;o="0"+s.toString(16);q=q+o.substr(o.length-2,2)}return q};var k=function(p){p=p.replace(/\x0d\x0a/g,"\x0a");var o="";for(var r=0;r127)&&(q<2048)){o+=String.fromCharCode((q>>6)|192);o+=String.fromCharCode((q&63)|128)}else{o+=String.fromCharCode((q>>12)|224);o+=String.fromCharCode(((q>>6)&63)|128);o+=String.fromCharCode((q&63)|128)}}}return o};e.extend({md5:function(o){var v=Array();var G,H,p,u,F,Q,P,N,K;var D=7,B=12,z=17,w=22;var O=5,L=9,J=14,I=20;var t=4,s=11,r=16,q=23;var E=6,C=10,A=15,y=21;o=k(o);v=f(o);Q=1732584193;P=4023233417;N=2562383102;K=271733878;for(G=0;G 2 | 3 | 4 | 5 | 6 | 7 | 8 | SYZOJ 9 | 10 | 11 | 12 | 13 | 14 | 15 | 31 | 32 | 33 | 34 |35 | 83 | 84 | {% block body %}{% endblock %} 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 114 | {% block script %}{% endblock %} 115 | 116 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /syzoj/controller.py: -------------------------------------------------------------------------------- 1 | from syzoj.models import User, Problem 2 | from urllib import urlencode 3 | import time, re 4 | 5 | 6 | class Tools(object): 7 | @staticmethod 8 | def pretty_time(t): 9 | return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) 10 | 11 | @staticmethod 12 | def to_str(s): 13 | return str(s) 14 | 15 | @staticmethod 16 | def url_encode(query, doseq=0): 17 | return urlencode(query, doseq) 18 | 19 | @staticmethod 20 | def get_cur_user(): 21 | return User.get_cur_user() 22 | 23 | 24 | class Checker(object): 25 | @staticmethod 26 | def is_valid_username(username): 27 | if not username: 28 | return False 29 | 30 | if len(username) < 3 or len(username) > 16: 31 | return False 32 | 33 | checker = re.compile("[A-Za-z0-9_]") 34 | if not checker.match(username): 35 | return False 36 | 37 | return True 38 | 39 | @staticmethod 40 | def is_valid_email(email): 41 | if not email: 42 | return False 43 | 44 | if len(email) < 3 or len(email) > 50: 45 | return False 46 | 47 | checker = re.compile("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$") 48 | if not checker.match(email): 49 | return False 50 | 51 | return True 52 | 53 | @staticmethod 54 | def is_valid_password(password): 55 | if not password: 56 | return None 57 | 58 | # Because of the salt is "syzoj2_xxx" and the "syzoj2_xxx" 's md5 is"59cb..." 59 | # the empty password 's md5 will equal "59cb.." 60 | syzoj2_xxx_md5 = "59cb65ba6f9ad18de0dcd12d5ae11bd2" 61 | if password == syzoj2_xxx_md5: 62 | return False 63 | 64 | return True 65 | 66 | 67 | class Paginate(): 68 | query = None 69 | total_page = 0 70 | per_page = 10 71 | cur_page = 1 72 | edge_display_num = 10 73 | make_url = None 74 | other = None 75 | 76 | def __init__(self, query, make_url=None, other=None, cur_page=1, per_page=10, edge_display_num=2): 77 | if not cur_page: 78 | cur_page = 1 79 | self.cur_page = int(cur_page) 80 | self.per_page = per_page 81 | self.edge_display_num = edge_display_num 82 | self.query = query 83 | self.make_url = make_url 84 | self.other = other 85 | total = query.count() 86 | self.total_page = total / per_page 87 | if total % per_page: 88 | self.total_page += 1 89 | 90 | def have_pre(self, cur_page=None): 91 | if not cur_page: 92 | cur_page = self.cur_page 93 | print cur_page > 1 94 | return cur_page > 1 95 | 96 | def have_next(self, cur_page=None): 97 | if not cur_page: 98 | cur_page = self.cur_page 99 | return cur_page < self.total_page 100 | 101 | def need_omit_left(self): 102 | return self.cur_page - self.edge_display_num > 1 103 | 104 | def need_omit_right(self): 105 | return self.cur_page + self.edge_display_num < self.total_page 106 | 107 | def range(self): 108 | start = self.cur_page - self.edge_display_num 109 | stop = self.cur_page + self.edge_display_num + 1 110 | if start < 1: 111 | start = 1 112 | if stop > self.total_page + 1: 113 | stop = self.total_page + 1 114 | return range(start, stop) 115 | 116 | def get(self): 117 | return self.query.offset((self.cur_page - 1) * self.per_page).limit(self.per_page) 118 | 119 | def get_html(self): 120 | pre_disable = "" 121 | next_disable = "" 122 | left_omit = "" 123 | right_omit = "" 124 | pre_url = "" 125 | next_url = "" 126 | pid_list = "" 127 | 128 | if self.have_pre(): 129 | pre_url = self.make_url(self.cur_page - 1, self.other) 130 | else: 131 | pre_disable = "am-disabled" 132 | if self.have_next(): 133 | next_url = self.make_url(self.cur_page + 1, self.other) 134 | else: 135 | next_disable = "am-disabled" 136 | 137 | if self.need_omit_left(): 138 | left_omit = '''36 |82 |37 |
39 | 40 | 81 |SYZOJ 38 |
... ''' 139 | if self.need_omit_right(): 140 | right_omit = '''... ''' 141 | 142 | for pid in self.range(): 143 | active = "" 144 | if pid == self.cur_page: 145 | active = "am-active" 146 | pid_list += '''''' + str(pid) + ''' ''' 148 | 149 | html = '''150 | 159 |''' 160 | return html 161 | 162 | 163 | def register(username, password, email): 164 | state_code = 0 165 | if not Checker.is_valid_username(username): 166 | state_code = 2002 167 | elif not Checker.is_valid_password(password): 168 | state_code = 2007 169 | elif not Checker.is_valid_password(email): 170 | state_code = 2006 171 | elif User.query.filter_by(username=username).first(): 172 | state_code = 2008 173 | else: 174 | state_code = 1 175 | user = User(username=username, password=password, email=email) 176 | user.save() 177 | return state_code 178 | 179 | 180 | def create_problem(user, title): 181 | problem = Problem(user=user, title=title) 182 | problem.save() 183 | print problem 184 | return problem.id 185 | 186 | 187 | def become_admin(user): 188 | user.is_admin = True 189 | user.save() 190 | 191 | 192 | def cancel_admin(user): 193 | user.is_admin = False 194 | user.save() 195 | -------------------------------------------------------------------------------- /syzoj/models/contest.py: -------------------------------------------------------------------------------- 1 | from syzoj import db 2 | from syzoj.models.problem import Problem 3 | import time 4 | import json 5 | 6 | 7 | class ContestRanklist(db.Model): 8 | """ 9 | save ranklist as json 10 | follow is ranklist structure 11 | { 12 | "player_num": player_num 13 | 1: the ContestPlayer's id of rank1 14 | 2: the ContestPlayer's id of rank2 15 | ... 16 | } 17 | """ 18 | id = db.Column(db.Integer, primary_key=True) 19 | ranklist = db.Column(db.Text) 20 | 21 | def __init__(self): 22 | ranklist = {"player_num": 0} 23 | self.ranklist = json.dumps(ranklist) 24 | 25 | def save(self): 26 | db.session.add(self) 27 | db.session.commit() 28 | 29 | def get_players(self): 30 | ranklist = json.loads(self.ranklist) 31 | players = [] 32 | for i in range(ranklist["player_num"]): 33 | player = ContestPlayer.query.filter_by(id=ranklist[str(i)]).first() 34 | players.append(player) 35 | return players 36 | 37 | def update(self, new_player=None): 38 | players = self.get_players() 39 | if not new_player in players: 40 | players.append(new_player) 41 | 42 | players.sort(key = lambda p: p.score, reverse = True) 43 | # players.sort(cmp=lambda x, y: x.score > y.score or (x.score == y.score and x.time_spent < y.time_spent)) 44 | 45 | ranklist = {"player_num": len(players)} 46 | for rank, player in enumerate(players): 47 | ranklist[rank] = player.id 48 | 49 | self.ranklist = json.dumps(ranklist) 50 | 51 | 52 | class ContestPlayer(db.Model): 53 | id = db.Column(db.Integer, primary_key=True) 54 | contest_id = db.Column(db.Integer, db.ForeignKey("contest.id"), index=True) 55 | contest = db.relationship("Contest", backref=db.backref("players", lazy="dynamic")) 56 | user_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True) 57 | user = db.relationship("User", backref=db.backref("contests", lazy="dynamic")) 58 | 59 | score = db.Column(db.Integer) 60 | score_details = db.Column(db.Text) 61 | time_spent = db.Column(db.Integer) 62 | 63 | def __init__(self, contest_id, user_id): 64 | self.contest_id = contest_id 65 | self.user_id = user_id 66 | 67 | self.score = 0 68 | self.time_spent = 0 69 | self.score_details = "" 70 | 71 | def __repr__(self): 72 | return "" % \ 73 | (self.contest_id, self.user_id, self.score_details) 74 | 75 | def update_score(self, problem, score, judge_id): 76 | score_details = {} 77 | if self.score_details: 78 | score_details = json.loads(self.score_details) 79 | pid = str(problem.id) 80 | score_details[pid] = {} 81 | score_details[pid]["score"] = score 82 | score_details[pid]["judge_id"] = judge_id 83 | score_details["score"] = 0 84 | for key, val in score_details.iteritems(): 85 | if isinstance(val, dict): 86 | score_details["score"] += val["score"] 87 | self.score = score_details["score"] 88 | self.time_spent = problem.submit_num 89 | self.score_details = json.dumps(score_details) 90 | 91 | def get_score_details(self): 92 | return json.loads(self.score_details) 93 | 94 | def save(self): 95 | db.session.add(self) 96 | db.session.commit() 97 | 98 | 99 | class Contest(db.Model): 100 | id = db.Column(db.Integer, primary_key=True) 101 | title = db.Column(db.String(80)) 102 | start_time = db.Column(db.Integer) # goodbye at 2038-1-19 103 | end_time = db.Column(db.Integer) 104 | 105 | holder_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True) 106 | holder = db.relationship("User", backref=db.backref("hold_contests", lazy='dynamic')) 107 | 108 | information = db.Column(db.Text) 109 | # save use text represent problems id,split by "|" 110 | # for example use "2|23|123" represent this contest use problems which id equal 2\23 or 123 111 | problems = db.Column(db.Text) 112 | 113 | ranklist_id = db.Column(db.Integer, db.ForeignKey("contest_ranklist.id"), index=True) 114 | ranklist = db.relationship("ContestRanklist", backref=db.backref("contests", lazy="dynamic")) 115 | 116 | def __init__(self, title, start_time, end_time, holder): 117 | self.title = title 118 | self.start_time = start_time 119 | self.end_time = end_time 120 | self.holder = holder 121 | 122 | ranklist = ContestRanklist() 123 | self.ranklist = ranklist 124 | 125 | def __repr__(self): 126 | return " " % self.title 127 | 128 | def save(self): 129 | db.session.add(self) 130 | db.session.commit() 131 | 132 | def is_allowed_edit(self, user=None): 133 | if user and user.have_privilege(4): 134 | return True 135 | if user and user.id == self.holder.id: 136 | return True 137 | return False 138 | 139 | def new_submission(self, judge): 140 | problems = self.get_problems() 141 | if judge.problem not in problems: 142 | pass 143 | return False 144 | 145 | player = self.players.filter_by(user_id=judge.user_id).first() 146 | if not player: 147 | player = ContestPlayer(self.id, judge.user_id) 148 | player.update_score(judge.problem, judge.score, judge.id) 149 | player.save() 150 | self.ranklist.update(player) 151 | self.ranklist.save() 152 | 153 | def is_running(self, now=None): 154 | if not now: 155 | now = int(time.time()) 156 | return self.start_time <= now and now <= self.end_time 157 | 158 | def get_ranklist(self): 159 | return self.ranklist.ranklist 160 | 161 | def get_problems(self): 162 | if not self.problems: 163 | return [] 164 | 165 | problems = [] 166 | for pid in self.problems.split('|'): 167 | pid = int(pid) 168 | problems.append(Problem.query.filter_by(id=int(pid)).first()) 169 | return problems 170 | 171 | def set_problems(self, problems_list): 172 | self.problems = "" 173 | for pid in problems_list: 174 | if Problem.query.filter_by(id=pid).first(): 175 | if self.problems: 176 | self.problems += '|' 177 | self.problems += str(pid) 178 | else: 179 | pass 180 | # TODO:raise error 181 | -------------------------------------------------------------------------------- /syzoj/models/judge.py: -------------------------------------------------------------------------------- 1 | from syzoj import db 2 | from syzoj.models.contest import Contest 3 | from syzoj.models.user import UserAcProblem 4 | import json 5 | import time 6 | 7 | 8 | class JudgeState(db.Model): 9 | id = db.Column(db.Integer, primary_key=True) 10 | code = db.Column(db.Text) 11 | language = db.Column(db.String(20)) 12 | 13 | status = db.Column(db.String(50), index=True) 14 | score = db.Column(db.Integer, index=True) 15 | result = db.Column(db.Text) 16 | 17 | user_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True) 18 | user = db.relationship("User", backref=db.backref("submit", lazy='dynamic')) 19 | 20 | problem_id = db.Column(db.Integer, db.ForeignKey("problem.id"), index=True) 21 | problem = db.relationship("Problem", backref=db.backref("submit", lazy='dynamic')) 22 | 23 | submit_time = db.Column(db.Integer) # googbye at 2038-1-19 24 | 25 | # "type" indicate it's contest's submission(type = 1) or normal submission(type = 0) 26 | # type=2: this is a test submission 27 | # if it's contest's submission (type = 1), the type_info is contest_id 28 | # use this way represent because it's easy to expand 29 | type = db.Column(db.Integer) 30 | type_info = db.Column(db.Integer) 31 | 32 | def __init__(self, code, language, user, problem, type=0, type_info=None, submit_time=None): 33 | if not submit_time: 34 | submit_time = int(time.time()) 35 | self.code = code 36 | self.language = language 37 | self.user = user 38 | self.problem = problem 39 | self.submit_time = submit_time 40 | 41 | self.type = type 42 | self.type_info = type_info 43 | 44 | self.score = 0 45 | self.status = "Waiting" 46 | self.result = '{"status": "Waiting", "total_time": 0, "total_memory": 0, "score":0, "case_num": 0}' 47 | 48 | def __repr__(self): 49 | print " " % self.id 50 | 51 | def save(self): 52 | db.session.add(self) 53 | db.session.commit() 54 | 55 | def is_allowed_see_result(self, user=None): 56 | if user and user.id == self.problem.user.id: 57 | return True 58 | 59 | if self.type == 0: 60 | if not self.problem.is_public: 61 | if user and (user.have_privilege(2) or user.have_privilege(3)): 62 | return True 63 | return False 64 | return True 65 | elif self.type == 1: 66 | if user and user.have_privilege(4): 67 | return True 68 | contest = Contest.query.filter_by(id=self.type_info).first() 69 | if contest.is_running(): 70 | return False 71 | else: 72 | return True 73 | elif self.type == 2: 74 | if user and (user.have_privilege(2) or user.have_privilege(3) or self.user == user.id): 75 | return True 76 | else: 77 | return False 78 | 79 | return False 80 | 81 | def is_allowed_see_code(self, user=None): 82 | if user and user.id == self.problem.user.id: 83 | return True 84 | 85 | if self.type == 0: 86 | if not self.problem.is_public: 87 | if user and (user.have_privilege(2) or user.have_privilege(3)): 88 | return True 89 | return False 90 | return True 91 | elif self.type == 1: 92 | if user and user.have_privilege(4): 93 | return True 94 | contest = Contest.query.filter_by(id=self.type_info).first() 95 | if contest.is_running(): 96 | if user and self.user == user: 97 | return True 98 | else: 99 | return False 100 | else: 101 | return True 102 | elif self.type == 2: 103 | if user and (user.have_privilege(2) or user.have_privilege(3) or self.user == user.id): 104 | return True 105 | else: 106 | return False 107 | 108 | return False 109 | 110 | def get_result(self): 111 | return json.loads(self.result) 112 | 113 | def update_result(self, result): 114 | self.score = result["score"] 115 | self.status = result["status"] 116 | self.result = json.dumps(result) 117 | 118 | def update_related_info(self): 119 | if self.type == 0: 120 | self.user.refresh_submit_info() 121 | self.user.save() 122 | 123 | self.problem.submit_num += 1 124 | if self.status == "Accepted": 125 | self.problem.ac_num += 1 126 | self.problem.save() 127 | elif self.type == 1: 128 | contest = Contest.query.filter_by(id=self.type_info).first() 129 | contest.new_submission(self) 130 | 131 | # only normal submittion is counted 132 | def update_userac_info(self): 133 | if self.type == 0: 134 | all_user_ac = UserAcProblem.query.filter_by(user_id = self.user.id).all() 135 | for ac_info in all_user_ac: 136 | if ac_info.problem_id == self.problem.id: 137 | if ac_info.is_accepted and self.status != "Accepted": 138 | return 139 | 140 | new_ac_info = UserAcProblem(user_id = ac_info.user_id, problem_id = ac_info.problem_id, judge_id = self.id) 141 | ac_info.delete() 142 | 143 | if self.status == "Accepted": 144 | new_ac_info.is_accepted = True 145 | else: 146 | new_ac_info.is_accepted = False 147 | new_ac_info.save() 148 | return 149 | 150 | new_ac_info = UserAcProblem(user_id = self.user.id, problem_id = self.problem.id, judge_id = self.id) 151 | if self.status == "Accepted": 152 | new_ac_info.is_accepted = True 153 | else: 154 | new_ac_info.is_accepted = False 155 | new_ac_info.save() 156 | return 157 | 158 | 159 | class WaitingJudge(db.Model): 160 | id = db.Column(db.Integer, primary_key=True) 161 | judge_id = db.Column(db.Integer, db.ForeignKey("judge_state.id")) 162 | judge = db.relationship("JudgeState", backref=db.backref("waiting_judge", lazy="dynamic")) 163 | 164 | def __init__(self, judge): 165 | self.judge = judge 166 | 167 | def __repr__(self): 168 | print " " % self.judge_id 169 | 170 | def save(self): 171 | db.session.add(self) 172 | db.session.commit() 173 | 174 | def delete(self): 175 | db.session.delete(self) 176 | db.session.commit() 177 | -------------------------------------------------------------------------------- /syzoj/models/user.py: -------------------------------------------------------------------------------- 1 | from flask import request 2 | from syzoj import db 3 | from .problem import Problem 4 | import urllib, hashlib 5 | from random import randint 6 | import time 7 | 8 | 9 | class Session(db.Model): 10 | id = db.Column(db.String(120), primary_key=True) 11 | 12 | user_id = db.Column(db.Integer, db.ForeignKey("user.id"), index=True) 13 | user = db.relationship("User", backref=db.backref("sessions", lazy='dynamic')) 14 | 15 | login_time = db.Column(db.Integer) # googbye at 2038-1-19 16 | expiration_time = db.Column(db.Integer) 17 | 18 | def __init__(self, user, login_time=None, valid_time=3600 * 24 * 7): 19 | if not login_time: 20 | login_time = int(time.time()) 21 | self.id = str(randint(1, int(1e50))) 22 | self.user = user 23 | self.login_time = login_time 24 | self.expiration_time = login_time + valid_time 25 | 26 | def __repr__(self): 27 | print " " % (self.username, self.password, self.email) 108 | 109 | def save(self): 110 | db.session.add(self) 111 | db.session.commit() 112 | 113 | def have_privilege(self, privilege_type): 114 | for privilege in UserPrivilege.query.filter_by(user_id = self.id).all(): 115 | if privilege.privilege_type == privilege_type or privilege.privilege_type == 1: 116 | return True 117 | return False 118 | 119 | def is_allowed_edit(self, user): 120 | if not user: 121 | return False 122 | if self.id == user.id or user.have_privilege(7): 123 | return True 124 | return False 125 | 126 | def get_submitted_problems(self): 127 | submitted_problems = dict() 128 | for ac_info in UserAcProblem.query.filter_by(user_id = self.id).all(): 129 | submitted_problems[ac_info.problem_id] = [ac_info.is_accepted, ac_info.judge_id] 130 | return submitted_problems 131 | 132 | def refresh_submit_info(self): 133 | cnt = 0 134 | for ac_info in UserAcProblem.query.filter_by(user_id = self.id).all(): 135 | if ac_info.is_accepted: 136 | cnt += 1 137 | self.ac_num = cnt 138 | 139 | @staticmethod 140 | def get_cur_user(session_id=None): 141 | if not session_id: 142 | session_id = request.cookies.get('session_id') 143 | 144 | sessions = Session.query.filter_by(id=session_id).all() 145 | for s in sessions: 146 | if s.is_valid(): 147 | return s.user 148 | 149 | return None 150 | 151 | @staticmethod 152 | def find_user(nickname=None, id=None): 153 | if id: 154 | return User.query.filter_by(id=id).first() 155 | 156 | if nickname: 157 | return User.query.filter_by(nickname=nickname).first() 158 | 159 | return None 160 | 161 | def give_privilege(self, privilege_type): 162 | for privilege in UserPrivilege.query.filter_by(user_id = self.id).all(): 163 | if privilege.privilege_type == privilege_type: 164 | return False # User already had privilege 165 | new_privilege = UserPrivilege(user_id = self.id, privilege_type = privilege_type) 166 | new_privilege.save() 167 | return True 168 | 169 | def del_privilege(self, privilege_type): 170 | for privilege in UserPrivilege.query.filter_by(user_id = self.id).all(): 171 | if privilege.privilege_type == privilege_type: 172 | privilege.delete() 173 | return True 174 | return False # User doesnt have privilege 175 | 176 | class UserAcProblem(db.Model): 177 | __tablename__ = 'UserAcProblem' 178 | id = db.Column(db.Integer, primary_key = True) 179 | user_id = db.Column(db.Integer, index = True) 180 | problem_id = db.Column(db.Integer) 181 | is_accepted = db.Column(db.BOOLEAN) 182 | judge_id = db.Column(db.Integer) 183 | 184 | def __init__(self, user_id, problem_id, judge_id): 185 | self.user_id = user_id 186 | self.problem_id = problem_id 187 | self.is_accepted = False 188 | self.judge_id = judge_id 189 | 190 | def save(self): 191 | db.session.add(self) 192 | db.session.commit() 193 | 194 | def delete(self): 195 | db.session.delete(self) 196 | db.session.commit() 197 | 198 | 199 | 200 | -------------------------------------------------------------------------------- /syzoj-judge/judge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | #!/usr/bin/python 3 | import os 4 | import time 5 | import zipfile 6 | import urllib 7 | import urllib2 8 | import json 9 | import ExTJudger 10 | import codecs 11 | import subprocess 12 | from random import randint 13 | 14 | _SYZOJ_URL = "http://localhost:8811" 15 | _DOWNLOAD_TESTDATA_URL = _SYZOJ_URL + "/static/uploads" 16 | _GET_TASK_URL = _SYZOJ_URL + "/api/waiting_judge" 17 | _UPLOAD_TASK_URL = _SYZOJ_URL + "/api/update_judge" 18 | _SESSION_ID = "77783949202395150352388871624955475980489287735056" 19 | _BASE_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__))) 20 | _TESTDATA_DIR = os.path.join(_BASE_DIR, "testdata") 21 | 22 | if not os.path.isdir(_TESTDATA_DIR): 23 | os.mkdir(_TESTDATA_DIR) 24 | 25 | 26 | def get_judge_task(): 27 | global _GET_TASK_URL, _SESSION_ID 28 | url = _GET_TASK_URL + "?" + urllib.urlencode({"session_id": _SESSION_ID}) 29 | task = urllib2.urlopen(url).read() 30 | return json.loads(task) 31 | 32 | 33 | def upload_judge_result(result, judge_id): 34 | global _UPLOAD_TASK_URL, _SESSION_ID 35 | url = _UPLOAD_TASK_URL + "/" + str(judge_id) + "?" + urllib.urlencode({"session_id": _SESSION_ID}) 36 | data = urllib.urlencode({"result": json.dumps(result)}) 37 | req = urllib2.Request(url, data) 38 | response = urllib2.urlopen(req) 39 | return response.read() 40 | 41 | 42 | def download_file(url, des): 43 | df = urllib2.urlopen(url) 44 | with open(des, "a") as f: 45 | while True: 46 | data = df.read(4096) 47 | if data: 48 | f.write(data) 49 | else: 50 | break 51 | df.close() 52 | 53 | 54 | def unzip_as_testdata(testdata, des_dir): 55 | if not os.path.isdir(des_dir): 56 | os.mkdir(des_dir) 57 | 58 | zip_file = zipfile.ZipFile(testdata) 59 | 60 | for name in zip_file.namelist(): 61 | with open(os.path.join(des_dir, name), "wb") as f: 62 | f.write(zip_file.read(name)) 63 | f.close() 64 | 65 | zip_file.close() 66 | 67 | 68 | def get_testdata_dir(testdata_name): 69 | global _TESTDATA_DIR, _DOWNLOAD_TESTDATA_URL 70 | testdata_dir = os.path.join(_TESTDATA_DIR, testdata_name) 71 | if os.path.isdir(testdata_dir): 72 | return testdata_dir 73 | 74 | tmp_zip_file = _TESTDATA_DIR + testdata_name + "_tmp.zip" 75 | download_file(_DOWNLOAD_TESTDATA_URL + "/" + testdata_name, tmp_zip_file) 76 | unzip_as_testdata(tmp_zip_file, testdata_dir) 77 | os.remove(tmp_zip_file) 78 | 79 | return testdata_dir 80 | 81 | 82 | def write_src(source, target): 83 | if os.path.isfile(target): 84 | os.remove(target) 85 | with codecs.open(target, "w", "utf-8") as f: 86 | f.write(source) 87 | 88 | 89 | def run(source_file, std_in, std_out, time_limit, memory_limit): 90 | user_out = "user_tmp.out" 91 | 92 | CFG = { 93 | 'language':'C++', 94 | 'source_name':source_file, 95 | 'in_file':std_in, 96 | 'out_file':user_out, 97 | 'ans_file':std_out, 98 | 'time_limit':time_limit, 99 | 'memory_limit':memory_limit, 100 | 'compile option':['-lm', '-DONLINE_JUDGE'] 101 | } 102 | 103 | res = ExTJudger.run(CFG) 104 | 105 | result = {} 106 | result['status'] = res['status'] 107 | 108 | if not 'use_time' in res: 109 | result['time_used'] = 0 110 | else: 111 | result["time_used"] = res["use_time"] 112 | if not 'use_memory' in res: 113 | result['memory_used'] = 0 114 | else: 115 | result["memory_used"] = res["use_memory"] 116 | 117 | result['score'] = res['score'] 118 | 119 | if 'in' in res: 120 | result["input"] = res['in'][0: min(120, len(res['in']))] 121 | if len(res['in']) > 120: 122 | result["input"] += '\n...' 123 | if 'ans' in res: 124 | result["answer"] = res['ans'][0: min(120, len(res['ans']))] 125 | if len(res['ans']) > 120: 126 | result["answer"] += '\n...' 127 | if 'out' in res: 128 | result["user_out"] = res['out'][0: min(120, len(res['out']))] 129 | if len(res['out']) > 120: 130 | result["user_out"] += '\n...' 131 | if 'compile_info' in res: 132 | result['compile_info'] = res['compile_info'] 133 | if len(res['compile_info']) > 256: 134 | result["compile_info"] += '\n...' 135 | 136 | if os.path.isfile(user_out): 137 | os.remove(user_out) 138 | return result 139 | 140 | 141 | def judge(source, time_limit, memory_limit, testdata): 142 | result = {"status": "Judging", "score": 0, "total_time": 0, "max_memory": 0, "case_num": 0} 143 | target = "tjudger_source_file.cpp" 144 | 145 | testdata_dir = get_testdata_dir(testdata) 146 | 147 | write_src(source, target) 148 | 149 | with open(os.path.join(testdata_dir, "data_rule.txt")) as f: 150 | data_rule = f.read() 151 | lines = data_rule.split('\n') 152 | for i in range(0, len(lines)): 153 | lines[i] = lines[i].replace('\r', '').replace('\n', '') 154 | dt_no = lines[0].split() 155 | std_in = lines[1] 156 | std_out = lines[2] 157 | 158 | for i, no in enumerate(dt_no): 159 | std_in_file = os.path.join(testdata_dir, std_in.replace("#", str(no))) 160 | std_out_file = os.path.join(testdata_dir, std_out.replace("#", str(no))) 161 | 162 | res = run(target, std_in_file, std_out_file, time_limit, memory_limit) 163 | 164 | if res['status'] == "Compile Error": 165 | result['compiler_output'] = res['compile_info'] 166 | result['status'] = "Compile Error" 167 | return result 168 | 169 | result[i] = res 170 | result["case_num"] += 1 171 | result["total_time"] += res["time_used"] 172 | if res["memory_used"] > result["max_memory"]: 173 | result["max_memory"] = res["memory_used"] 174 | 175 | if res["status"] == "Accepted": 176 | result["score"] += 1.0 / len(dt_no) * res['score'] 177 | elif result["status"] == "Judging": 178 | result["status"] = res["status"] 179 | 180 | result["score"] = int(result["score"] + 0.1) 181 | if result["status"] == "Judging": 182 | result["status"] = "Accepted" 183 | return result 184 | 185 | 186 | def main(): 187 | while True: 188 | time.sleep(1) 189 | task = get_judge_task() 190 | if not task["have_task"]: 191 | continue 192 | 193 | try: 194 | result = judge(task["code"], task["time_limit"], task["memory_limit"], task["testdata"]) 195 | except: 196 | result = {"status": "System Error", "score": 0, "total_time": 0, "max_memory": 0, "case_num": 0} 197 | 198 | upload_judge_result(result, task["judge_id"]) 199 | 200 | 201 | def test_connect_to_server(): 202 | task = get_judge_task() 203 | testdata_dir = get_testdata_dir(task["testdata"]) 204 | print task 205 | print testdata_dir 206 | print upload_judge_result({"status": "System Error", "score": 0, "total_time": 0, "max_memory": 0, "case_num": 0}, 207 | task["judge_id"]) 208 | 209 | 210 | if __name__ == '__main__': 211 | # test_connect_to_server() 212 | # main() 213 | while True: 214 | try: 215 | main() 216 | except: 217 | pass 218 | -------------------------------------------------------------------------------- /syzoj/static/prettify.js: -------------------------------------------------------------------------------- 1 | !function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; 2 | (function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= 3 | b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a 122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f =2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k =5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, 10 | q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", 11 | /^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+ 12 | s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, 13 | q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d= 14 | c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i =0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], 18 | "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], 19 | O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], 20 | Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, 21 | V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]+/],["dec",/^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-", 22 | /^ ]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^