// ==UserScript==
// @name 强力 OI 跳题器 Super Problem Jumper
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 支持在所有网页跳转到题目,支持洛谷、CodeForces、AtCoder、LOJ、UOJ、UVA 等多种题库的题目
// @author 0
// @match *://*/*
// ==/UserScript==
const luogu="https://www.luogu.com.cn/problem/",
cf="https://codeforces.com/problemset/problem/",
at="https://atcoder.jp/contests/",
poj="http://poj.org/problem?id=",
loj="https://https://loj.ac/p/",
uoj="https://https://uoj.ac/problem/",
spoj="https://www.spoj.com/problems/",
uva="https://onlinejudge.org/",
spojl="https://www.luogu.com.cn/remoteJudgeRedirect/spoj/",
uval="https://www.luogu.com.cn/remoteJudgeRedirect/uva/",
hydro="https://hydro.ac/p/",
vijos="https://vijos.org/p/",
dbzoj="https://darkbzoj.cc/problem/",
ybt="http://ybt.ssoier.cn:8088/problem_show.php?pid=",
hdu="https://acm.hdu.edu.cn/showproblem.php?pid=",
ural="https://acm.timus.ru/problem.aspx?space=1&num=",
sdx="https://sdxoj.tk/p/";
var prefixPattern=[
['P',luogu+'P',4],
['B',luogu+'B',4],
['U',luogu+'U',4],
['T',luogu+'T',4],
['LGP',luogu+'P',4],
['LGB',luogu+'B',4],
['LGU',luogu+'U',4],
['LGT',luogu+'T',4],
['LUOGU',luogu+'P',4],
['LUOGUP',luogu+'P',4],
['LUOGUB',luogu+'B',4],
['LUOGUU',luogu+'U',4],
['LUPGUT',luogu+'T',4],
['AT',luogu+'AT',3],
['LOJ',loj,1],
['LIBRE',loj,1],
['LIBREOJ',loj,1],
['UOJ',uoj,1],
['UNIVERSAL',uoj,1],
['UNIVERSALOJ',uoj,1],
['SP',spojl,1],
//['UVA',uval,3],
['UVA',luogu+'UVA',3], //由于 UVA 比较卡,UVA 题号会跳转到洛谷爬取的 UVA 题目,如果需要跳到 UVA 原站只需要取消上一行的注释
['POJ',poj,4],
['BZ',dbzoj,4],
['BZOJ',dbzoj,4],
['LYDSY',dbzoj,4],
['LYSBZ',dbzoj,4],
['DBZOJ',dbzoj,4],
['DARKBZOJ',dbzoj,4],
['HYDRO',hydro+'H',4],
['HYDROOJ',hydro+'H',4],
['VIJOS',vijos,4],
['YBT',ybt,4],
['一本通',ybt,4],
['HDU',hdu,4],
['URAL',ural,4],
['URALOJ',ural,4],
['TIMUS',ural,4],
['TIMUSOJ',ural,4],
['SDX',sdx+'P',1],
['SDXOJ',sdx+'P',1]
];
function isNumber(str){
for (var i in str){
var ascii=str.codePointAt(i);
if(ascii<48||ascii>57) return false;
}
return true;
}
function JumpById(id){
var found=false;
var probId,contestId,contestNum;
console.log(id);
prefixPattern.forEach(
function(info){
if(id.length>=info[0].length+info[2]&&id.substr(0,info[0].length)==info[0]){
var problemUrl=id.substr(info[0].length);
if(isNumber(problemUrl)){
found=true;
window.open(info[1]+problemUrl);
return;
}
}
}
);
if(found) return;
if(id.match(/CF[0-9]{1,}[A-Z][0-9]?/)==id){
probId=id[id.length-1];
contestId='';
if(isNumber(probId)) probId=id.substr(id.length-2);
contestId=id.substr(2,id.length-2-probId.length);
if(isNumber(contestId)){
return window.open(cf+contestId+'/'+probId+'/');
}
}
console.log(id.match(/AT.*[A-Z1-9]/));
if(id.match(/AT.*[A-Z1-9]/)==id){
probId=id[id.length-1].toLowerCase();
contestId=id.substr(2,id.length-3).toLowerCase();
contestNum=contestId.substr(3,3);
if(contestId.substr(0,3)=='arc'&&parseInt(contestNum)<=34&&probId.match(/[a-z]/)==probId) probId=String(probId.codePointAt(0)-96);
return window.open(at+contestId+'/tasks/'+contestId+'_'+probId+'/');
}
if(id.match(/A[BRG]C[0-9]{3,}[A-Z1-9]/)==id){
probId=id[id.length-1].toLowerCase();
contestId=id.substr(0,id.length-1).toLowerCase();
contestNum=contestId.substr(3,3);
if(contestId.substr(0,3)=='arc'&&parseInt(contestNum)<=34&&probId.match(/[a-z]/)==probId) probId=String(probId.codePointAt(0)-96);
return window.open(at+contestId+'/tasks/'+contestId+'_'+probId+'/');
}
if(id.match(/HYDROOJ.*/)==id) return window.open(hydro+id.substr(7));
if(id.match(/HYDRO.*/)==id) return window.open(hydro+id.substr(5));
if(id.match(/SDXOJ.*/)==id) return window.open(sdx+id.substr(5));
if(id.match(/SDX.*/)==id) return window.open(sdx+id.substr(3));
return false;
}
(function(){
console.log(1);
'use strict';
document.ondblclick=function(){
//alert('dblckicl');
var selText=window.getSelection().toString().toUpperCase();
while(1){
var prevText=selText;
selText=selText.replace(/[ _\-\t]/,'');
if(prevText==selText) break;
}
JumpById(selText);
};
// $('body').bind('keypress',getKeyCode);
function getKeyCode(e) {
var evt = e || window.event;
var keyCode = evt.keyCode || evt.which || evt.charCode;
alert(keyCode);
}
})();