专栏文章

oj.daimayuan.top 查看补题情况 插件

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miozx2a6
此快照首次捕获于
2025/12/03 03:53
3 个月前
此快照最后确认于
2025/12/03 03:53
3 个月前
查看原文
省流:code is cheap, show me the talk.
完整脚本见 https://www.luogu.me/paste/h5z2xsxl#

打算为 http://oj.daimayuan.top 添加显示补题情况的功能。
首先,补题情况的数据如何获取呢?在统计(http://oj.daimayuan.top/contest//problem//statistics )界面 F12 点击网络,发现它直接请求了 html。我们这样问 deepseek:
帮我写一段 js 函数,参数为比赛 id 和题目 id,返回这道题通过的人的名单
注:以下是 await fetch("http://oj.daimayuan.top/contest/356/problem/3215/statistics?page=1").then(x=>x.text()) 的返回结果。你需要枚举 page 直到该页没有用户,并从返回的 html 中解析出通过本题的用户名单:
// 以下是 这段 html
于是我们得到了一段代码。运行一下,发现它卡在那里了。尝试一下发现 page= 在超过总页数后会返回最后一页。于是我们回复:
该网页的逻辑是:如果 page 超过 max_page,则返回 max_page 这页的结果。请修改代码
发现可以成功运行。这里我们正式提出我们的需求:
这是 http://oj.daimayuan.top/contest/356/standings 的 html。你需要编写一个油猴脚本,如果表格中某个人通过了这个题,则将其背景色改为浅绿色。同时,在表头题目那里加入本题通过人数(只统计表格中的人)。
查询某个人是否通过某个题,可以通过调用之前编写的 getAcceptedUsers 实现。
// 下面是这个 html
发现它生成的代码硬编码了我刚才示例的题目,无语。
你可以通过表格获取题目 id
然后:
当前 通过人数 和 题目编号 重合了,请调整样式
此时已经完美地实现了我的需求了,甚至还加了一个进度条。
然后,我想整一些活:
(这版 prompt 改了很多次,我找不到原来的版本了)
对表格进行一些调整:增加一个三个状态的切换按钮:“默认、只按分数排、按补题数排”。其中“默认”状态下显示原来的表格,“只按分数排”状态改变排名方式。原来排名方式为分数+通过时间双关键字排序,改为只按分数排序。此时排名计算会发生变化,如可能出现有两个并列第一,没有第二的情况。按补题数排则按照这个人通过的题目数量(可能赛后会通过该题,即按照新获取的数据分析而不是按照赛时分数分析)进行排名。相同补题数量则并列。
注意:任意状态下,都需要高亮“我”所在列,就如同默认状态下那样
使用油猴插件实现
  1. 你需要在上一个脚本的基础上实现这个功能,保留上一个脚本的功能。
  2. 通过这道题的定义为:上一个脚本把这个位置标为了浅绿色背景
  3. 尽量不要添加花哨的样式,用最简单的方式实现。比如:直接对表格的列排序,然后修改每列的第一行的文字(排名)
然而 deepseek 还是听不懂人话,输出了 html。
你需要写一个油猴脚本,动态获取页面数据并修改页面,而不是写一个 html
  1. 不要给表格添加额外的样式,与默认样式保持一致
  2. “只按分数排”中排名计算方式为:分数>当前 user 分数的人数 +1; “按补题数排”中排名计算方式为:补题数>当前 user 补题数的人数 +1
  3. 保留上一个脚本中的进度条。在上一个脚本中补题情况渲染完成后再渲染按钮
这个就是我们想要的结果了。然而它的代码还是有一些 bug,我手动修改了一下:
  1. 删除了它的 current-user-row 类样式
  2. 改变了 totalScore 的获取方式
  3. 改变了排序逻辑
最终效果:

评论

0 条评论,欢迎与作者交流。

正在加载评论...