您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add the "score table" to Codeforces in practice/virtual contest
- // ==UserScript==
- // @name CF-problem-score-table
- // @version 0.0.1
- // @description Add the "score table" to Codeforces in practice/virtual contest
- // @match *://codeforces.com/contest/*
- // @grant GM_getValue
- // @grant GM_setValue
- // @namespace https://gf.qytechs.cn/users/410786
- // ==/UserScript==
- (async function(){
- const contestId=location.pathname.match('^/contest/(\\d+)')[1]
- let problems
- // stored value: [] for educational rounds, list of [index, points] otherwise
- if(GM_getValue('problem_score_'+contestId)!==undefined){
- problems=JSON.parse(GM_getValue('problem_score_'+contestId))
- if(problems.length>0&&problems[0][1]===null){ // fix a bug in previous version
- problems=[]
- GM_setValue('problem_score_'+contestId,JSON.stringify(problems))
- }
- }else{
- const data=await $.get(`/api/contest.standings?contestId=${contestId}&from=1&count=1`)
- if(data.status!=='OK'){
- console.log('Failed: ',data)
- return
- }
- problems=[]
- for(let problem of data.result.problems){
- if(!('points' in problem)){ // educational contest
- break
- }
- problems.push([problem.index,problem.points])
- }
- problems.sort()
- GM_setValue('problem_score_'+contestId,JSON.stringify(problems))
- }
- if(problems.length==0)
- return
- //let lastDark=problems.length%2!=0 // more consistent with Codeforces (according to
- // http://web.archive.org/web/20160123153752/http://codeforces.com/contest/617), but is not as beautiful
- // because the header row is light.
- let lastDark=false
- function lastDarkState(){
- return lastDark?'dark':''
- }
- function nextDarkState(){
- lastDark=!lastDark
- return lastDarkState()
- }
- // Thanks to the Internet Archive, I could get the "score table" HTML source without waiting for a real
- // contest. I just go to http://web.archive.org/web/*/https://codeforces.com/contest/*, then filter by
- // 'contest/' and sort by unique.
- // The page with the maximum unique count must have the score table.
- //
- // Taken from page: http://web.archive.org/web/20151230151115/http://codeforces.com/contest/611
- // (or http://web.archive.org/web/20160123153752/http://codeforces.com/contest/617 for Russian version)
- //
- // Currently only English is supported, but it's trivial to add the Russian version.
- let problemsHTML=String.raw`
- <div class="roundbox sidebox" style="">
- <div class="roundbox-lt"> </div>
- <div class="roundbox-rt"> </div>
- <div class="caption titled">→ Score table
- <div class="top-links">
- </div>
- </div>
- <table class="rtable ">
- <tbody>
- <tr>
- <th class="left" style="width:100%;"></th>
- <th class="" style="width:8em;">Score</th>
- </tr>
- `
- for(let [index,score] of problems){
- problemsHTML+=String.raw`
- <tr>
- <td class="left ${nextDarkState()}"><a href="/contest/${contestId}/problem/${index}">Problem ${index}</a></td>
- <td class=" ${lastDarkState()}">${score}</td>
- </tr>
- `
- }
- problemsHTML+=String.raw`
- <tr>
- <td class="left ${nextDarkState()}"><span style="color:green;">Successful hack</span></td>
- <td class=" ${lastDarkState()}">100</td>
- </tr>
- <tr>
- <td class="left ${nextDarkState()}"><span style="color:red;">Unsuccessful hack</span></td>
- <td class="${lastDarkState()}">-50</td>
- </tr>
- <tr>
- <td class="left ${nextDarkState()}"><span style="color:black;">Unsuccessful submission</span></td>
- <td class="${lastDarkState()}">-50</td>
- </tr>
- <tr>
- <td class="left bottom ${nextDarkState()}"><span style="color:black;">Resubmission</span></td>
- <td class="bottom ${lastDarkState()}">-50</td>
- </tr>
- </tbody>
- </table>
- </div>
- `
- $('#sidebar').append(problemsHTML)
- $('#sidebar').append(String.raw`
- <div style="text-align:right; position:relative;bottom:1.75em;">
- <span class="small" style="color:gray;">* If you solve problem on 00:00 from the first attempt</span>
- </div>
- `)
- })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址