Scoring providers
Choose how rCTF calculates point values for decay challenges.
Scoring providers calculate point values for decay challenges. rCTF includes six algorithms that use solve counts, event timing, or both.
Configuration
scoreProvider: name: scores/classic # DefaultEach challenge sets a point range via points.min and points.max in its data. The scoring provider calculates the current point value from the solve count and other context.
Score context
All scoring providers receive a context object with:
| Field | Description |
|---|---|
minPoints |
Minimum points for the challenge (floor) |
maxPoints |
Maximum points for the challenge (ceiling, when 0 solves) |
solves |
Current number of solves |
maxSolves |
Maximum solves across all challenges (used by scores/legacy) |
eventStartTime |
Competition start time (used by scores/jammy) |
eventEndTime |
Competition end time (used by scores/jammy) |
firstSolveTime |
Time of the first solve for the challenge (used by scores/jammy) |
Providers
Charts use a sample challenge with minPoints: 100 and maxPoints: 500. Solve-based providers show the full provider family with the current tab highlighted, while scores/jammy uses its own time-based curve.
The default scoring algorithm. Uses a logistic decay function that drops points as more teams solve the challenge.
scoreProvider: name: scores/classicChallenges start at maxPoints with zero solves and decay toward minPoints as the solve count climbs. The decay curve is moderate, which works for most CTFs.
Logarithmic decay with tuned constants (gradient=10, decay=60). Produces a gentler curve than scores/classic.
scoreProvider: name: scores/sekaiSimilar to scores/classic but with a steeper decay curve. Points drop more aggressively with early solves, so challenges differentiate faster.
scoreProvider: name: scores/steepTime-based scoring that values challenges by when they were first solved. Unlike the other providers, this one looks at the first solve time relative to the event duration rather than how many teams solved the challenge.
scoreProvider: name: scores/jammy options: maximumScoreTime: 0.8 # Optional, default 0.8| Option | Default | Description |
|---|---|---|
maximumScoreTime |
0.8 |
Fraction of event duration used to ramp from minimum to maximum points. First solves after this threshold receive maximum points. |
Note
This provider needs startTime and endTime set in the configuration. It uses the first solve time to anchor the scoring curve.
A binary scoring algorithm. It returns maxPoints if the challenge has 0 to 2 solves, and 0 points otherwise. Good for challenges that shouldn’t contribute to the score once they’re widely solved.
scoreProvider: name: scores/genniHyperbolic tangent-based decay that normalizes against the maximum solve count across all challenges. This was the original rCTF scoring algorithm.
scoreProvider: name: scores/legacyNote
This provider needs maxSolves (the maximum solve count across all challenges) to normalize the curve. Expect surprising results if challenge solve counts vary widely.