AtCoder Traffic Light

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

  1. // ==UserScript==
  2. // @name AtCoder Traffic Light
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description AtCoderの問題のページから直接解説のページに行くことができます。
  6. // 問題横のボタンが赤の場合:読み込み中です待っていてください。
  7. // 問題横のボタンが黄の場合:全体解説のみありました。
  8. // 問題横のボタンが緑の場合:この問題の解説がありました。
  9. // @author soraie
  10. // @match https://atcoder.jp/contests/*/tasks/*
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14.  
  15. /* ユーザー設定項目 */
  16.  
  17. const color = {
  18. "green":"#2cf44c", //緑
  19. "yellow":"#fff25e", //黄色
  20. "red":"#ff5757" //赤
  21. };
  22.  
  23. /* 設定項目終わり */
  24.  
  25.  
  26.  
  27. //各解説のサイト
  28. //1.各問題解説:https://atcoder.jp/contests/{contest}/editorial/{number}
  29. //2.全体解説pdf:https://img.atcoder.jp/{contest}/editorial.pdf
  30. //3.スライド:https://www.slideshare.net/{chokudai}/{contest}
  31. //ユーザー解説:他
  32. //全体解説Youtube:https://youtube.com/{any}
  33.  
  34.  
  35. if(moment() < endTime)return;//コンテスト中
  36. let btn = $(".btn.btn-default.btn-sm").eq(0);
  37. btn.css("background-color",color.red);
  38. btn.css("pointer-events","none");
  39. (function() {
  40. 'use strict';
  41. 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`;
  42. $.ajax(url).done((data) => {
  43. let link = data.response.split("コンテスト全体の解説");
  44. link[0] = link[0].match(/<a.*公式解説.*a>|<a.*ユーザ.*a>/g);link[1] = link[1].match(/<a.*公式解説.*a>|<a.*ユーザ.*a>/g);
  45. let final = "";//最終的なボタンのリンク
  46. if(link[0] !== null){
  47. for(let i = 0;i < link[0].length;i++){
  48. let ele = link[0][i].match(/href=".*".*target/)[0];
  49. ele = ele.replace(/href="|".*target/g,"");
  50. if(ele.match(/\/editorial\//) !== null){
  51. final = ele;
  52. break;
  53. }
  54. final = ele;
  55. }
  56. btn.attr("href",final);btn.attr("target","_blank");btn.css("pointer-events","");
  57. btn.css("background-color",color.green);
  58. }
  59. else{
  60. if(link[1] === null){
  61. //もう何もできないので潔く負けを認める
  62. btn.text("解説無し");
  63. }
  64. for(let i = 0;i < link[1].length;i++){
  65. let ele = link[1][i].match(/href=".*".*target/)[0];
  66. ele = ele.replace(/href="|".*target/g,"");
  67. if(ele.match(/editorial\.pdf/) !== null){
  68. final = ele;
  69. break;
  70. }
  71. final = ele;
  72. }
  73. btn.attr("href",final);btn.attr("target","_blank");btn.css("pointer-events","");
  74. btn.css("background-color",color.yellow);
  75. }
  76. })
  77. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址