Created
September 9, 2021 17:31
-
-
Save xdoju/7b75a182e5b2d87224c7d3c9b08247c5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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