Skip to content

Commit dd7cb2d

Browse files
mzuennimpsijm
andauthored
Add secondary sort-keys to --order-from-ccs (#447)
* changed order from ccs * Update bin/tools.py Co-authored-by: Maarten Sijm <[email protected]> * fix call --------- Co-authored-by: Maarten Sijm <[email protected]>
1 parent 9091a8d commit dd7cb2d

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

bin/tools.py

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -193,31 +193,49 @@ def get_pos(id):
193193

194194
if config.args.order_from_ccs:
195195
# Sort by increasing difficulty, extracted from the CCS api.
196-
# Get active contest.
196+
class ProblemStat:
197+
def __init__(self):
198+
self.solved = 0
199+
self.submissions = 0
200+
self.pending = 0
201+
self.teams_submitted = 0
202+
self.teams_pending = 0
203+
204+
def update(self, team_stats: dict[str, Any]):
205+
if team_stats["solved"]:
206+
self.solved += 1
207+
if team_stats["num_judged"]:
208+
self.submissions += team_stats["num_judged"]
209+
self.teams_submitted += 1
210+
if team_stats["num_pending"]:
211+
self.pending += team_stats["num_pending"]
212+
self.teams_pending += 1
213+
214+
def key(self) -> tuple[int, int]:
215+
# self.solved more AC => easier
216+
# possible tie breakers:
217+
# self.submissions more needed to get the same number of AC => Harder
218+
# self.teams_pending more teams tried => appeared easier
219+
# TODO: consider more stats?
220+
return (-self.solved, self.submissions)
197221

222+
# Get active contest.
198223
cid = get_contest_id()
199-
solves = dict()
200224

201225
# Read set of problems
202226
contest_problems = call_api_get_json(f"/contests/{cid}/problems?public=true")
203227
assert isinstance(problems, list)
204-
for path in contest_problems:
205-
solves[path["id"]] = 0
228+
229+
problem_stats = {problem["id"]: ProblemStat() for problem in contest_problems}
206230

207231
scoreboard = call_api_get_json(f"/contests/{cid}/scoreboard?public=true")
208232

209233
for team in scoreboard["rows"]:
210-
for path in team["problems"]:
211-
if path["solved"]:
212-
solves[path["problem_id"]] += 1
213-
214-
# Convert away from defaultdict, so any non matching keys below raise an error.
215-
solves = dict(solves)
216-
verbose("solves: " + str(solves))
234+
for team_stats in team["problems"]:
235+
problem_stats[team_stats["problem_id"]].update(team_stats)
217236

218237
# Sort the problems
219-
# Use negative solves instead of reversed, to preserver stable order.
220-
problems.sort(key=lambda p: (-solves[p.name], p.label))
238+
problems.sort(key=lambda p: (problem_stats[p.name].key(), p.label))
221239
verbose(f"order: {', '.join(map(lambda p: str(p.label), problems))}")
222240

223241
if ask_variable_bool("Update order in contest.yaml"):

0 commit comments

Comments
 (0)