Greasy Fork is available in English.

AtCoder Traffic Light

AtCoderの問題のページから直接解説のページに行くことができます。

2021/01/13時点のページです。最新版はこちら。

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         AtCoder Traffic Light
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  AtCoderの問題のページから直接解説のページに行くことができます。
//               問題横のボタンが赤の場合:読み込み中です待っていてください。
//               問題横のボタンが黄の場合:全体解説のみありました。
//               問題横のボタンが緑の場合:この問題の解説がありました。
// @author       soraie
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none
// ==/UserScript==


/* ユーザー設定項目 */

const color = {
    "green":"#2cf44c",    //緑
    "yellow":"#fff25e",   //黄色
    "red":"#ff5757"       //赤
};

/* 設定項目終わり */



//各解説のサイト
//1.各問題解説:https://atcoder.jp/contests/{contest}/editorial/{number}
//2.全体解説pdf:https://img.atcoder.jp/{contest}/editorial.pdf
//3.スライド:https://www.slideshare.net/{chokudai}/{contest}
//ユーザー解説:他
//全体解説Youtube:https://youtube.com/{any}


if(moment() < endTime)return;//コンテスト中
let btn = $(".btn.btn-default.btn-sm").eq(0);
btn.css("background-color",color.red);
btn.css("pointer-events","none");
(function() {
    'use strict';
    let now = location.href.split("/"),url = `https://1d878d9b.us-south.apigw.appdomain.cloud/proxy?url=https://atcoder.jp/contests/${now[4]}/tasks/${now[6]}/editorial?lang=ja`;
    $.ajax(url).done((data) => {
        let link = data.response.split("コンテスト全体の解説");
        link[0] = link[0].match(/<a.*公式解説.*a>|<a.*ユーザ.*a>/g);link[1] = link[1].match(/<a.*公式解説.*a>|<a.*ユーザ.*a>/g);
        let final = "";//最終的なボタンのリンク
        if(link[0] !== null){
            for(let i = 0;i < link[0].length;i++){
                let ele = link[0][i].match(/href=".*".*target/)[0];
                ele = ele.replace(/href="|".*target/g,"");
                if(ele.match(/\/editorial\//) !== null){
                    final = ele;
                    break;
                }
                final = ele;
            }
            btn.attr("href",final);btn.attr("target","_blank");btn.css("pointer-events","");
            btn.css("background-color",color.green);
        }
        else{
            if(link[1] === null){
                //もう何もできないので潔く負けを認める
                btn.text("解説無し");
            }
            for(let i = 0;i < link[1].length;i++){
                let ele = link[1][i].match(/href=".*".*target/)[0];
                ele = ele.replace(/href="|".*target/g,"");
                if(ele.match(/editorial\.pdf/) !== null){
                    final = ele;
                    break;
                }
                final = ele;
            }
            btn.attr("href",final);btn.attr("target","_blank");btn.css("pointer-events","");
            btn.css("background-color",color.yellow);
        }
    })
})();