Appearance
竞赛
当前竞赛模块支持类 Kaggle 分数赛,并通过 SSE 推送实时排名。 ICPC、IOI、OI 等其他赛制尚未开放。
赛制与基本规则
- 赛制:
kaggle(当前唯一支持的赛制)。 - 每道竞赛题配置一个满分,参赛者在规定时间内提交代码、作答客观题或上传 zip 产物。
- 每道题只取该参赛者的最高分,所有题目的最高分相加得到总分。
- 可按题目配置提交次数上限(
submission_limits);未配置的题目不限制提交次数, 失败提交也会计入次数。 - 排名按总分从高到低,同分时按达到最高分的时间排序(较早达到者靠前)。
报名与参赛
公开赛可自助报名,邀请赛需要邀请码:
| 竞赛分类 | 报名方式 | 是否进入公开列表 |
|---|---|---|
public 公开赛 | 登录后自助报名(可设竞赛密码);仅管理员可创建 | 是 |
invite 邀请赛 | 需提供正确邀请码;可设置 | 否(仅链接 + 邀请码可见) |
访问与提交的时机限制
- 竞赛未开始(pending)时,题目一律不可访问。
- 竞赛进行期间,题目与提交仅对已报名参赛者开放。
- 竞赛结束后开放回看:公开赛对所有访客可见,邀请赛的竞赛页仍仅参赛者 / 管理员可见。
- 管理员不受上述参赛者限制。
公开赛会"收编"题目(2026-09-26)
题目被加入公开赛后,在竞赛结束时间之前,除题目所有者与管理员外,其他人访问这道题 的题库页面与独立接口都会 404(题库列表里仍能看到条目,点进去即 404);竞赛 end_time 一过 自动恢复可见。
- 题目所有者/管理员打开该题时会看到保密提示横幅,提示"仅管理员和题目所有者可见"。
- 因此公开赛的题目请通过竞赛入口做题与提交;把题目收藏成
/problems/<编号>直链在赛前 / 赛中会 404,请改用竞赛题目页链接。 - 邀请赛不受该规则影响(邀请赛的题目访问本就由参赛者身份与邀请码门控)。
做题人
- 在「竞赛」页浏览公开竞赛并报名 / 参加。
- 竞赛期间在竞赛题目页提交代码、作答客观题套卷或上传 zip 产物。
- 排名页可实时查看排名(实时刷新由 SSE 驱动);竞赛题目是否计入全局统计由竞赛配置决定。
- 竞赛题目默认不计入全局榜单,除非运营者设置
affect_global_ranking=true。
榜单可见性
竞赛可配置三种榜单可见性(ranking_visibility):
| 取值 | 说明 |
|---|---|
public | 公开可见 |
participants | 仅参赛者可查看 |
hidden | 完全隐藏 |
服务端封榜
支持服务端封榜:可配置结束前冻结的窗口(freeze_start_time 或 freeze_duration_seconds,二者只能配置一个)。
封榜期间各角色的视图
- 普通用户在封榜窗口内读取冻结视图(只反映冻结起点之前的数据),REST、SSE 与页面口径一致。
- 管理员始终看到实时完整榜。
- 封榜期间,普通用户的 SSE 也不再推送实时提交事件,避免从旁路推导实时变化。
榜单不是实时成绩
- 竞赛进行中,普通用户看到的排名不一定是完整公开榜(受榜单可见性与封榜影响)。
- 竞赛结束后进入待结算状态,需评测清空且管理员发布正式成绩快照后,普通用户才会看到正式榜; 不会自动暴露未完成评测的实时结果。
赛期题解门控与赛后复盘
- 赛期题解门控:属于「进行中竞赛」的题目,其题解(含他人已发布的)对普通用户整体不可见, 发布入口同时关闭;竞赛结束(到达结束时间)后自动恢复,无需人工干预。 该判定按时间窗口实时计算,不依赖定时任务。审核员与管理员不受限。
- 赛后复盘:竞赛结束后,竞赛页出现「赛后复盘」标签,可回看题目并进入题目页查阅官方题解。 可读性沿用既有赛后放行规则(参赛者可见)。
运营者 / 管理员
后台「竞赛」页可以:
- 创建 / 编辑竞赛:标题、时间、题目列表、公开状态、是否计入全局统计和每题提交次数限制。
- 配置榜单可见性与封榜:设置榜单可见性与结束前封榜时长(或封榜起点)。
- 结算与发布正式成绩:比赛结束后进入待结算状态,待评测清空且管理员发布正式成绩快照后, 普通用户才会看到正式榜。
- 管理参赛者。
- 查看竞赛排名与提交记录。
竞赛相关 API 与排行逻辑见 noj-core 的 src/domains/contest/routes/contests.ts 与 src/domains/contest/services/。