Atcoder Check First AC

Check First submit Resolved in Contests

As of 2023-04-25. See the latest version.

  1. // ==UserScript==
  2. // @name Atcoder Check First AC
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.05
  5. // @description Check First submit Resolved in Contests
  6. // @author tatetuke
  7. // @match https://atcoder.jp/contests/*/tasks/*
  8. // @match https://atcoder.jp/contests/*/submissions
  9. // @icon https://atcoder.jp/*
  10. // @grant none
  11. // @copyright 2023, tatetuke (https://tatetuke.github.io/)
  12. // @license MIT License; https://opensource.org/licenses/MIT
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. function get_URL(){
  19. var language = document.getElementsByClassName("select2-selection__rendered");
  20. language=Array.prototype.slice.call(language)[0].innerText;
  21. language=language.substr(0, language.indexOf(' ('));
  22. //特殊文字を変換
  23. language=language.replace( /\+/g,'%2B');
  24. language=language.replace( /#/g,'%23');
  25. var ret=location.href.substr(0,35)+'submissions?f.LanguageName='+language+'&f.Status=AC&f.Task='+location.href.substr(41,8)+'&f.User=&orderBy=created'
  26. return ret
  27. // https://atcoder.jp/contests/abc297/submissions?f.LanguageName=C%2B%2B&f.Status=AC&f.Task=abc297_a&f.User=&orderBy=created
  28. };
  29.  
  30.  
  31. function get_submit_URL(){
  32.  
  33. var submit_url=get_URL()
  34. // XMLHttpRequestオブジェクトの作成
  35. let request = new XMLHttpRequest();
  36.  
  37. request.onreadystatechange = function(){
  38. if (request.readyState == 4){
  39. if (request.status == 200){
  40. var texl =request.responseText
  41. //提出コードをURL取得
  42. var regexp_sub_url=/<a href="\/contests\/......\/submissions\/........">詳細<\/a>/g;
  43. const arr_url = [...texl.matchAll(regexp_sub_url)];
  44. //提出時間を取得(arr_urlと1対1対応)
  45. var regexp_sub_time=/<td class="no-break"><time class='fixtime fixtime-second'>........................<\/time><\/td>/g;
  46. const arr_time = [...texl.matchAll(regexp_sub_time)];
  47. //コンテスト時間を取得
  48. var regexp_contest_time=/<time class='fixtime fixtime-full'>........................<\/time>/g;
  49. const contest_time = [...texl.matchAll(regexp_contest_time)];
  50. //コンテスト開始/終了時間を取得
  51. var start_time=contest_time[0][0].substr(34,17);
  52. var end_time=contest_time[1][0].substr(34,17);
  53. // if(arr_time.lenght==0){
  54. // window.alert("not solved");
  55. // }
  56.  
  57. for ( i=0; i<arr_time.length ; i++) {
  58. var v_time=arr_time[i][0].substr(57,17)
  59. if(v_time>=start_time&&v_time<end_time){
  60. var url=arr_url[i][0].substr(9,37)
  61. // url='https://atcoder.jp'+url
  62. console.log(url)
  63. window.open(url, '_blank'); // 新しいタブを開き、ページを表示
  64. break;
  65. }
  66. // }else if(v_time>=end_time){
  67. // console.log('OK')
  68. // window.alert("not solved in contest");
  69. // var url2=arr_url[i][0].substr(9,37)
  70. // window.open(url2, '_blank');
  71. // break;
  72. // }
  73. }
  74.  
  75. }
  76. }
  77. }
  78.  
  79. request.open('GET', submit_url, true);
  80. request.send(null);
  81. };
  82.  
  83.  
  84.  
  85. function create_button() {
  86. var parent = document.getElementsByClassName("h2");
  87. var a = document.createElement("a");
  88. a.textContent = "First AC";
  89. a.setAttribute("class", "btn btn-default btn-sm");//AtcoderのCopyボタンと同じCSSを適用
  90. parent[0].appendChild(a);
  91. a.addEventListener('mouseup', get_URL, false);
  92. a.addEventListener('mouseup', get_submit_URL, false);
  93. };
  94. create_button();
  95.  
  96.  
  97. })();
  98.