Skip to content

Instantly share code, notes, and snippets.

@xdoju
Created September 9, 2021 17:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xdoju/7b75a182e5b2d87224c7d3c9b08247c5 to your computer and use it in GitHub Desktop.
Save xdoju/7b75a182e5b2d87224c7d3c9b08247c5 to your computer and use it in GitHub Desktop.
import argparse
import json
class Data:
def __init__(self, name, title):
self.name = name
self.title = title
self.submit_teams = {}
self.solved_teams = set()
self.first_solve = None
def main(args):
with open(args.contest) as contest:
contest = json.load(contest)
with open(args.runs) as runs:
runs = json.load(runs)
teams = {t['id']: t['name'] for t in contest['teams']}
table = {p['id']: Data(p['name'], p['title']) for p in contest['problems']}
for r in runs['runs']:
if args.frozen and r['frozen']:
continue
data = table[r['problem']]
team = r['team']
if team in data.solved_teams:
continue
if team not in data.submit_teams:
data.submit_teams[team] = 1
else:
data.submit_teams[team] += 1
if r['result'] == 'Yes':
data.solved_teams.add(team)
if data.first_solve is None:
data.first_solve = (teams[team], r['submissionTime'])
sum_solved_teams = 0
sum_total_submit = 0
for pid in sorted(table):
data = table[pid]
print(f'{data.name}. {data.title}')
submit_teams = len(data.submit_teams)
solved_teams = len(data.solved_teams)
team_ratio = solved_teams / submit_teams if submit_teams != 0 else 0
print(f'- {submit_teams} teams submitted, {solved_teams} teams solved ({team_ratio * 100:.2f}%)')
if data.first_solve is not None:
team, time = data.first_solve
print(f'- First solve: {team}, {time} min.')
total_submit = sum(v for k, v in data.submit_teams.items())
total_ratio = solved_teams / total_submit if total_submit != 0 else 0
solve_submit = sum(data.submit_teams[k] for k in data.solved_teams)
solve_ratio = solved_teams / solve_submit if solve_submit != 0 else 0
total_str = f'Total acc.: {solved_teams} / {total_submit} ({total_ratio * 100:.2f}%)'
solve_str = f'Solve acc.: {solved_teams} / {solve_submit} ({solve_ratio * 100:.2f}%)'
print(f'- {total_str}, {solve_str}')
print()
sum_solved_teams += solved_teams
sum_total_submit += total_submit
sum_total_ratio = sum_solved_teams / sum_total_submit if sum_total_submit != 0 else 0
print('*. Summary')
print(f'- Total acc.: {sum_solved_teams} / {sum_total_submit} ({sum_total_ratio * 100:.2f}%)')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--contest', default='contest.json')
parser.add_argument('--runs', default='runs.json')
parser.add_argument('--frozen', action='store_true')
args = parser.parse_args()
main(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment