“呱!!!!” - 我是怎么让 OJ 快乐起来的

1.快乐的引言

众所周知,没有人喜欢按照学校的规程学习,尤其是必须要完成类似于helloworld的无数种变体的检测智力的题目

😭
但是面对着几百道难以言说的学校OJ网站的标准课程任务 (是真的很弱智),我感到愁眉不展,难道,难道真的要把时间花在这样的破东西上面吗???!!
so,我开启了一项技术革 (wai)(gua) 计划,旨在解决各种令人头疼的问题
很高兴的是,我在“利用F12不找到平台BUG的比赛中”取得了2分钟的好成绩。在好几天(bushi)的努力之下(还包括学习怎么开发网页插件和油猴脚本),我成功的研究出来 “OJ快乐器1.0版本”,待我娓娓道来~trollface

2.烦人的设定

我们亲爱的(byd)OJ平台,为了防止亲爱的同学们去网上搜题,甚至关闭了复制和粘贴的功能。这就意味着,你必须要在网页上面的超级无敌难用的编辑器打代码,而且还要随时面对网页无响应导致你的代码全部丢失、还没办法复制下来、而且你点提交之后也无法再看到你的代码了的问题。这就,,,挺nt的。

YL%ZUWV~4IM)~Z_-{T24WXH.png

总之,用这玩意简直就是折磨,而且再让你把课本上每一道例题都做一遍(甚至还有作业),总共甚至有上千道

救命呀:( 救救我呀:(

所以目前我们需要解决的问题就很明了了:

  • 解决复制粘贴问题
  • 怎么更方便的做题

不过,事情可能没有这么复杂

3.搞笑的BUG

在计算机课上,我的同桌在疯狂研究怎么计算a+b=?的复杂问题,我却只能打开开发人员面板来简单的研究一下网页
一波搜索,线索产生了

O_UGBLGJ%R82J6EAVR-@HTX.png

其实藏得不深

但是很明显,直接修改名称是没有任何意义的,我们要对文件下手

当修改完名称之后,右键可以直接访问到js文件(不是,真的没有一点权限隔离嘛,,,)

9)0VV-Z_1UII82D7I-$QW.png

文件如上

I4OT1UZJ~DFM@J-9@K}C.png

地址就这么简单,,,,

so当我把文件内容复制进

APC-~IUYNAB99PMK37KEP-V.png

内容替换,复制和粘贴就可以直接使用啦~

不过这样每次使用还需要进行很复杂的操作,所以有三种办法:油猴脚本、插件和本地文件替换

三种方法尝试下来,还是本地文件替换最方便:下载js文件->指定替换->OK!!!

`8U6PXYD$Y7{3PSGHYP5FVW.png

4.复杂的玩法

现在就是另外一点:怎么样让AI来写这些题呢?

前排说明:我并不是不会写,纯粹就是觉得这玩意浪费时间,请不要用于别的用途!

$2ZOQI13_Q2KM$0ELL-HR.png

结构很明显,我们再看提交页面

8(J%FHE0HH5K~IO_VWOLX$8.png

so 部分代码如下

function getProblemPageURL() {
const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get('id');
return http://xxx/problem.php?id=${id};
}

在提交页面,获取问题页面HTML文件内容

async function getProblemContent() {
const problemPageURL = getProblemPageURL();
const response = await fetch(problemPageURL);

if (!response.ok) {
throw new Error(HTTP error! Status: ${response.status});
}

const html = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');

const descriptionHeader = doc.evaluate('//h2[contains(text(), "题目描述")]', doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
const outputHeader = doc.evaluate('//h2[contains(text(), "来源")]', doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

if (!descriptionHeader || !outputHeader) {
console.error("无法找到题目描述或样例输出部分");
return null;
}

let content = '';
let currentElement = descriptionHeader.nextElementSibling;

while (currentElement && (currentElement !== outputHeader.nextElementSibling.nextElementSibling)) {
content += currentElement.innerText + '\n';
currentElement = currentElement.nextElementSibling;
}

return content.trim();

}

获取真正需要的部分(上文中框起来的部分)

即:题目,描述、输入输出案例

之后发送给AI(这里我用同义千问,有送的token)

const problemContent = await getProblemContent();

异步处理,返回数据再进行处理,之后进行判断,如果正确就自动复制

copyToClipboard(cleanedSolution);

之后弹出提示,这样就可以愉快的粘贴上去啦~

这样,最基础的做题工具就完成啦

虽然真的很原始,但是我也就是一天就从接触到平台到开发出这个,也还挺快的

😋

5.愉快的未来

好了好了,从开心的心情转过来

这就有人问了:哎,你这怎么还是需要人手工去输东西呀,这太麻烦了

其实是可以搞的,毕竟你看:

U9$)UC~-KMGY%G4%LUP-($6.png

文件就是个png文件,虽然是随机生成的(同样的网址也会刷新出不一样的,算法咱不了解)

但是这玩意人工智能绝对可以认出来呀

那不就意味着,,

嗯~~~

嗯!

不多说啦,以后见!

😋