Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions .vitepress/theme/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,13 @@ kbd {
font-weight: 700;
}

.rating.red { color: #dc3545; }
.rating.yellow { color: #b38600; }
.rating.green { color: #198754; }
.rating.blue { color: #0aa2c0; }

.dark .rating.yellow { color: #ffc107; }
.dark .rating.green { color: #75b798; }
.dark .rating.blue { color: #6edff6; }
/* 与脚本中的用户名颜色一致,浅色和深色模式共用一套颜色 */
.rating.red { color: #dc2f5a; }
.rating.orange { color: #e8590c; }
.rating.blue { color: #337cf2; }
.rating.green { color: #2b9f4f; }
.rating.cyan { color: #1798b0; }
.rating.gray { color: #78828c; }

/* 页脚与大纲 */
.VPFooter {
Expand Down
2 changes: 1 addition & 1 deletion features/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
| 恢复讨论与短消息 | 恢复小明的OJ上关掉的讨论区和短消息,由 XMOJ-Script 的服务器提供。 |
| 讨论提醒、短消息提醒 | 有人回复、@你或者发短消息时弹出提醒。 |
| [粘贴发图](./image-hosting) | 在讨论区和短消息里直接粘贴截图。 |
| [用户评分](./rating) | 按 AC 率显示分数和彩色用户名。 |
| [用户评分](./rating) | 综合做题量、准确度和坚持度显示分数和彩色用户名。 |
| [徽章](../community/badges) | 用户名旁边的小标签。 |
| 设置云同步 | 把插件设置同步到云端,换电脑不用重新设置。 |

Expand Down
99 changes: 86 additions & 13 deletions features/rating.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,102 @@

开启「添加用户评分和用户名颜色」后,用户名会按评分显示颜色,个人主页上也会显示具体分数。

评分范围是 0–3000,只根据用户个人主页上公开的数据计算:解决的题数、各种评测结果的次数,以及每天的提交数和 AC 数。不依赖当前时间,也不需要额外请求,所以同一个主页在任何人的浏览器里算出来都是同一个分数。

## 怎么算

$$\text{评分} = \frac{\text{AC 的提交数}}{\text{全部提交数}} \times 1000$$
评分由三部分组成:

| 部分 | 权重 | 看什么 |
|------|------|--------|
| 做题量 | 57% | 解决了多少题 |
| 准确度 | 33% | 评测过的提交里,有多少解决了新题 |
| 坚持度 | 10% | 有提交记录的天数 |

### 用到的数据

全部来自个人主页:

| 符号 | 含义 |
|------|------|
| $S$ | 解决的题数 |
| $X$ | 失败的评测次数:格式错误、答案错误、时间超限、内存超限、输出超限、运行错误之和 |
| $a_d$ | 提交统计图中第 $d$ 天的 AC 数 |
| $D$ | 提交统计图中有提交的天数 |

编译错误和「忽略」不计入 $X$。已解决题目旁括号里的数字是这道题的全部提交次数,包括 AC 之后的提交,所以评分不使用它。

$S = 0$ 时评分为 0。

### 做题量

为了防止一天内大量粘贴代码刷题,每天的 AC 数超过 8 之后按对数增长。一天 AC 14 次折算成约 12.5 次,AC 120 次只折算成约 30 次:

$$g(a) = \begin{cases} a & a \le 8 \\ 8 + 8 \ln\left(1 + \dfrac{a - 8}{8}\right) & a > 8 \end{cases} \qquad B = \frac{\sum_d g(a_d)}{\sum_d a_d}$$

没有 AC 记录时 $B = 1$。$B$ 是一个 0–1 之间的折扣,正常练习和比赛时基本等于 1。

$$\text{做题量} = 1 - e^{-S B / 350}$$

做到几百题以后,继续刷题的收益会越来越小。要拿高分,还得靠准确度。

### 准确度

先算评测过的提交里解决新题的比例 $P$。分子分母都加了 40 次虚拟提交(其中 25% 成功),向普通水平收缩,所以只做了几道题、碰巧全对,并不会拿到高分:

$$P = \frac{S + 10}{S + X + 40}$$

AC 之后重复提交 AC 代码既不增加 $S$ 也不增加 $X$,对评分没有影响。

真正的强者也会在难题上失败,所以 $P$ 在 40%–55% 时得到满分。高于这个范围反而减分:几百道题几乎从不失败,更像是复制的代码。

$$\text{准确度} = \begin{cases} 0 & P < 0.15 \\ \dfrac{P - 0.15}{0.25} & 0.15 \le P < 0.4 \\ 1 & 0.4 \le P < 0.55 \\ \max\left(0.3,\ 1 - 2(P - 0.55)\right) & P \ge 0.55 \end{cases}$$

题做得越多,准确度越可信,所以它还要乘上可信度:

$$K = \frac{S}{S + 80}$$

### 坚持度

$$\text{坚持度} = 1 - e^{-D/250}$$

### 合在一起

$$\text{评分} = \operatorname{round}\left(3000 \times \left(0.57 \cdot \text{做题量} + 0.33 \cdot \text{准确度} \cdot K + 0.10 \cdot \text{坚持度}\right)^{0.9}\right)$$

### 算一遍

一个新用户解决了 2 道题,答案错误 12 次,没有其他失败。三天的 AC 数是 8、2、4,这三天都有提交:

- 每天 AC 都不超过 8,所以 $B = 1$,做题量 $= 1 - e^{-2/350} \approx 0.00570$
- $P = \frac{2 + 10}{2 + 12 + 40} \approx 0.2222$,准确度 $= \frac{0.2222 - 0.15}{0.25} \approx 0.2889$,$K = \frac{2}{82} \approx 0.0244$
- 坚持度 $= 1 - e^{-3/250} \approx 0.0119$
- 评分 $= 3000 \times (0.57 \times 0.00570 + 0.33 \times 0.2889 \times 0.0244 + 0.10 \times 0.0119)^{0.9} \approx 3000 \times 0.00677^{0.9} \approx 33$

全部提交数包括 WA、TLE、CE 等所有结果。所以评分看的是命中率,不是做了多少题。
## 例子

| 用户 | 全部提交 | AC | 评分 |
|------|---------|----|------|
| A | 100 | 80 | <span class="rating red">800</span> |
| B | 200 | 90 | <span class="rating yellow">450</span> |
| C | 150 | 50 | <span class="rating green">333</span> |
| D | 100 | 20 | <span class="rating blue">200</span> |
| 用户 | 情况 | 评分 |
|------|------|------|
| A | 解决 1500 题,平均每题失败 3 次 | <span class="rating orange">2358</span> |
| B | 解决 400 题,平均每题失败 1.25 次 | <span class="rating orange">2166</span> |
| C | 解决 600 题,平均每题失败 7 次 | <span class="rating blue">1672</span> |
| D | 解决 300 题,从未失败(像是复制的) | <span class="rating green">1431</span> |
| E | 解决 150 题,平均每题失败 3 次 | <span class="rating cyan">1024</span> |
| F | 和 D 一样,但每天 AC 50 题 | <span class="rating cyan">905</span> |
| G | 新用户,解决 20 题,平均每题失败 3 次 | <span class="rating gray">246</span> |

评分在浏览器里缓存一天,所以今天的提交通常明天才会反映出来。

## 颜色

| 颜色 | 评分 |
|------|------|
| <span class="rating red">红</span> | 高于 500 |
| <span class="rating yellow">黄</span> | 400–500 |
| <span class="rating green">绿</span> | 300–399 |
| <span class="rating blue">蓝</span> | 低于 300 |
| <span class="rating red">红</span> | 2400 及以上 |
| <span class="rating orange">橙</span> | 2000–2399 |
| <span class="rating blue">蓝</span> | 1600–1999 |
| <span class="rating green">绿</span> | 1200–1599 |
| <span class="rating cyan">青</span> | 800–1199 |
| <span class="rating gray">灰</span> | 低于 800 |

## 在哪里显示

Expand All @@ -35,4 +108,4 @@ $$\text{评分} = \frac{\text{AC 的提交数}}{\text{全部提交数}} \times 1

## 想提高评分?

少交没把握的代码。提交前先在本地测好;没过的时候,用[获取测试点数据](./get-data)找到原因再改,别反复试。
多做题,尤其是有挑战的题,并且减少失败的提交。提交前先在本地测好;没过的时候,用[获取测试点数据](./get-data)找到原因再改,别反复试。一天集中刷大量题目不会让评分涨得更快。
2 changes: 1 addition & 1 deletion index.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ hero:

features:
- title: 用户评分
details: 按 AC 率算出 0–1000 分,用户名按分数显示红、黄、绿、蓝四种颜色。
details: 综合做题量、准确度和坚持度算出 0–3000 分,难以刷分;用户名按分数显示六种颜色。
link: /features/rating
linkText: 怎么算的
- title: 粘贴就能发图
Expand Down
Loading