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
      }
   }
)

三、修改方法

  1. 备份
  2. 进入 db
  3. 输入代码回车看反馈

具体操作请看前一篇

posted @ 2024-02-22 17:24  Bowen404  阅读(251)  评论(0编辑  收藏  举报