HydroOJ 从入门到入土(14)批量修改题目难度
老师,这排名咋算的?为啥我在他后边??
很多学生比较关注排名,而排名又受到各种因素影响,其中最不可控的是题目难度(源码)。
因为题目难度默认为 0,也就是自动计算,但自动计算题目难度的时候,是从 10 倒数的,AC 率高了才会逐渐下降,但也基本不太会降到 1。而手动定过难度的题目,基本都从 1 开始往上数,很少到达 10 的难度。
所以一般刚拿到手都会安装的启蒙篇的题,难度都在 8 以上。
而一堆语法入门但是显示难度 8/9/10 的启蒙篇的题,和一堆指定了难度 3/4/5 的 CSP 模拟题,明显后者难度更高。所以难度的不一致,实际会造成排名的不准确。
于是准备批量修改一下指定范围内的题目的难度。采用的技术和上一篇批量修改前缀的差不多,都是直接修改数据库,注意做好备份。
一、需求
- 指定起止题号,包含左右端点,然后批量修改难度。
- 题号前缀需要保持一致。
- 起止可以相同,也就是单改一道题。
- 虽然也可以用题目 id 来批量修改,但是导入的时候题号和 id 的排序不一定一致,所以用 id 来批量修改不符合实际使用场景。
二、实现
起初想直接按 pid
排序,但因为 pid
是字符串,所以不能直接排,后来想到用 regex
筛选,但写出的东西丧心病狂,而且改个数就得重写,没法用。
后来想起来有个 sort
字段,为前缀+固定 6 位题号(前边不足补零)+后缀
,具体排序跟题库中的排序一致。这个可以直接拿来用。
最终代码如下:
db.document.updateMany(
{
domainId: "system",
docType: 10,
sort: { $gte: "B000001", $lte: "B000010" }
},
{
$set: {
difficulty: 1
}
}
)
三、修改方法
- 备份
- 进入 db
- 输入代码回车看反馈
具体操作请看前一篇。