Skip to content

[zh_CN] 6. 简介界面

tiger2005 edited this page Dec 11, 2021 · 3 revisions

⚠ 这个功能依赖 API,所以在 Codeforces 关停 API 的时候将会无法使用。

⚠ 这个功能中的“提交记录查看”依赖网页爬取,所以在 Codeforces 炸了的时候将会无法使用,在开启了重定向后需要去设置界面进行重定向验证。

__UYJTX___C7VH__P`578XY.png

简介界面致力于打造一个让用户更加舒适的观感体验。在此处,将会列举出一个用户的基本信息、rating 变化、练习情况和提交记录。

此界面分为三个子页面。一开始展示的便是主页面。你可以点击“更换用户”进行用户更换,可以留空,表示获取自己的信息。

主页面中,上方展示的是用户的基本信息,包括当前 rating、贡献分、好友等基础信息。随后显示的是 rating 变化曲线。你可以点击其中的点以传送到个人界面并且打开这场比赛的信息。随后是提交信息,其中包括提交总数、通过题目,以及两个模式下的 PP 值。PP 值的计算方式将会在最下方放出。

下面的操作栏中,“题目统计”和“提交记录”分别导向剩下的两个子页面。右下角的三个指示灯分别表示个人信息、rating 图表和提交记录的加载情况,其中包括当前加载完毕的内容量。

RX_0__3L5_60FU71`__AS_U.png

点击“题目统计”可以进入题目统计页面。这个页面和题目界面功能类似,但是在搜索功能中有一些调整。

  • 加入了 :contest:gym 过滤器分别表示选择正规比赛的题目以及选择训练场的题目。
  • 同时加入 :incontest:practice 表示这道题目是否在比赛时没有通过的情况下在之后进行练习并提交。
  • 去除没有用途的 :unf

上方多出了一个条状图,表示的是该用户每一种题目做过的题目数量的大致情况,颜色对应标签颜色。

其余的特性在题目界面的介绍中已经提及,在此不多介绍。

JG2PAU_WNQL@EN`~P_QB7FB.png

点击“提交记录”打开提交记录界面。在此处你可以看一个提交频率图。你可以点击上方的年份切换显示的信息。同时,你可以在图中进行拖动,选中一个区域后将会把搜索限制覆盖为选中区域内的提交记录。

中间部分为提交记录信息。点击题目名称可以在题目窗口中打开题目。点击每条记录右边的记录信息跳转到提交记录页面。提交记录页面将会在下面具体讲述。后面表示的是测试数据类型。如果这个提交记录结果并非通过,那么将会显示第一个错误的测试点编号。常见的测试数据类型为 MAINPRETSAMP ,分别表示主测试、Pretest 和样例。

下方为状态栏。搜索框仍然拥有特定的搜索方式,将会在下面详细讲述。在切换页面按钮后,只有一个按钮——选择是否显示练习的提交(不是在比赛的时候的提交)。

关于 PP 计算方式:

目前来说沿用 osu! 的 pp (potential point) 的计算方式并进行优化。

首先选取所有通过的题目,在比赛 PP 中需要去除赛后通过的题目。

然后取出所有题目的 rating,并且按照降序排序,取出前 100 个,如果不够则补 0。

假设得到了数组 $a_{0..99}$,那么:$pp=\dfrac{\sum_{i=0}^{99}(a_i \times 0.95^i)}{\sum_{i=0}^{99}0.95^i}$。简单来说,更难的题目拥有更大的比重。

利用这个数据可以大致评判这个用户的水平。如果比赛 PP 过低,说明并没有参加过很多高难度比赛;如果比赛 PP 和练习 PP 相差甚远,说明这个用户主要为赛后刷题。

接下来介绍提交记录的搜索规则。输入的字符串将会以空白字符进行划分,然后依次判断。如果该串符合搜索标签,那么按照搜索标签进行限制,否则对题目名字进行全字匹配找到名字包含该字符串的提交记录。

定义 Number 类限制和 String 类限制,其中前者可以使用比较运算符(=,!=,>,<,>=,<=),后者只能使用 = 运算符,大小写不敏感。
如果限制处写着 ------ ,表明这是一个无参数限制(也就是后面不需要加比较符号以及比较者)
使用方式举例:
":cid=1234"            比赛 ID 为 1234
":cid=1234 :index=A"   比赛 ID 为 1234 且题目下标为 A 的题目,等同于 :pid=1234A
":time>=2021 :ac"      在 2021 年后的所有 AC 记录
":incontest :uac"      在比赛过程中没有通过的提交记录
-------------------------------------------------------------------------------------------------------
:cid        [String] 比赛的 ID。
:index      [String] 题目的下标(例如:A, B, A1, 01)。支持模糊匹配,具体为输入 A 可以匹配 A、A1、A2 等。
:pid        [String] 题目 ID(例如:4A; 1234D)。支持模糊匹配,具体为输入 A 可以匹配 A、A1、A2 等。
:time       [Number] 提交时间。比较的具体方式如下:
               1. 将当前提交的开始时间量化为 yyyyMMddhhmm 形式,如 2021/4/1 22:35 就会变成 "202104012235"。
               2. 和查询字符串进行长度比较,将比赛开始时间的长度通过删除末尾元素或追加 0 使得和查询字符串长度一致。
               3. 进行字典序比较。
               在这种形式下,你可以使用 ":time=202104" 获取 2021 年 4 月份的所有提交记录,使用 ":time>2020" 获取 2021 年至今的所有提交记录。
:incontest  [------] 在比赛过程中的提交记录。
:practice   [------] 比赛后的提交记录。
:ac         [------] 已通过的提交记录。
:uac        [------] 未通过的提交记录。
:contest    [------] 正常比赛的提交记录。
:gym        [------] 训练场的提交记录。
:verdict    [String] 提交结果。除了 `Accepted` 定义为 `AC` 外,其他的大多数都会被定义为首字母的拼接。具体定义在下方。

function toSmallInfo(x){
	// in case it's still testing
	if (x == undefined || x == "") return "INQ";
	if (x == "OK") return "AC";
	if (x == "FAILED") return "FAIL";
	if (x == "PARTIAL") return "PRT";
	if (x == "COMPILATION_ERROR") return "CE";
	if (x == "RUNTIME_ERROR") return "RE";
	if (x == "WRONG_ANSWER") return "WA";
	if (x == "PRESENTATION_ERROR") return "PE";
	if (x == "TIME_LIMIT_EXCEEDED") return "TLE";
	if (x == "MEMORY_LIMIT_EXCEEDED") return "MLE";
	if (x == "IDLENESS_LIMIT_EXCEEDED") return "ILE";
	if (x == "SECURITY_VIOLATED") return "SV";
	if (x == "CRASHED") return "CRS";
	if (x == "INPUT_PREPARATION_CRASHED") return "IPC";
	if (x == "CHALLENGED") return "CHL";
	if (x == "SKIPPED") return "SKP";
	if (x == "TESTING") return "TST";
	if (x == "REJECTED") return "REJ";
	return "ERR";
}