Greasy Fork is available in English.

Atcoder Check First AC

Check First submit Resolved in Contests

2024-04-07 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

  1. // ==UserScript==
  2. // @name Atcoder Check First AC
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.11
  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. // @exclude https://atcoder.jp/contests/*/tasks/*/editorial
  10. // @icon https://atcoder.jp/*
  11. // @grant none
  12. // @copyright 2023, tatetuke (https://tatetuke.github.io/)
  13. // @license MIT License; https://opensource.org/licenses/MIT
  14. // ==/UserScript==
  15.  
  16. (function() {
  17. 'use strict';
  18.  
  19. function get_URL(){
  20. var contest_name=location.href
  21. console.log(contest_name)
  22. contest_name=contest_name.replace('https://atcoder.jp/contests/','')
  23. contest_name=contest_name.replace('/tasks/','')
  24. contest_name=contest_name.replace('/editorial','')
  25.  
  26. var contest_name_num=contest_name.substr(contest_name.length/2-1,contest_name.length/2+1)
  27. contest_name=contest_name.substr(0,contest_name.length/2-1)
  28.  
  29. //使用言語を取得
  30. var language = document.getElementsByClassName("select2-selection__rendered");
  31.  
  32. //console.log(language)
  33. language=Array.prototype.slice.call(language)[0].innerText;
  34. language=language.substr(0, language.indexOf(' ('));
  35. if(language.indexOf(' ')!=-1){
  36. language=language.substr(0, language.indexOf(' '));
  37. }
  38. //console.log(language)
  39. //特殊文字を変換
  40. language=language.replace( /\+/g,'%2B');
  41. language=language.replace( /#/g,'%23');
  42.  
  43. var ret='https://atcoder.jp/contests/'+contest_name+'/submissions?f.LanguageName='+language+'&f.Status=AC&f.Task='+contest_name_num+'&f.User=&orderBy=created'
  44. // https://atcoder.jp/contests/abc297/submissions?f.LanguageName=C%2B%2B&f.Status=AC&f.Task=abc297_a&f.User=&orderBy=created
  45. // https://atcoder.jp/contests/joi2018ho/submissions?desc=true&f.LanguageName=C%2B%2B&f.Status=AC&f.Task=joi2018ho_a&f.User=&orderBy=created
  46. // window.open(ret, '_blank'); // 新しいタブを開き、ページを表示
  47. console.log(language)
  48.  
  49. return [ret ,language]
  50.  
  51. };
  52.  
  53.  
  54. function get_submit_URL(){
  55. var query=get_URL()
  56. var submit_url=query[0]
  57. var language=query[1]
  58. console.log(language)
  59.  
  60. // XMLHttpRequestオブジェクトの作成
  61. let request = new XMLHttpRequest(submit_url);
  62.  
  63. request.onreadystatechange = function(){
  64. if (request.readyState == 4){
  65. if (request.status == 200){
  66. var contest_name=location.href
  67. contest_name=contest_name.replace('https://atcoder.jp/contests/','')
  68. contest_name=contest_name.replace('/tasks/','')
  69. var contest_name_num=contest_name.substr(contest_name.length/2-1,contest_name.length/2+1)
  70. contest_name=contest_name.substr(0,contest_name.length/2-1)
  71. var texl =request.responseText
  72. // console.log(texl)
  73. //提出コードをURL取得
  74. // var regexp_sub_url=/<a href="\/contests\/....../\/submissions\/........">詳細<\/a>/g;
  75. var regexp_sub_url=new RegExp('<a href="\/contests\/'+contest_name+'\/submissions\/[0-9]{6,8}">詳細<\/a>','g');
  76. //console.log(regexp_sub_url)
  77. // [0-9]{6~8}
  78. const arr_url = [...texl.matchAll(regexp_sub_url)];
  79. // <a href="/contests/abc017/submissions/40929732">詳細</a>
  80.  
  81. console.log(arr_url.length)
  82.  
  83. //提出時間を取得(arr_urlと1対1対応)
  84. var regexp_sub_time=/<td class="no-break"><time class='fixtime fixtime-second'>........................<\/time><\/td>/g;
  85. const arr_time = [...texl.matchAll(regexp_sub_time)];
  86.  
  87. //コンテスト時間を取得
  88. var regexp_contest_time=/<time class='fixtime fixtime-full'>........................<\/time>/g;
  89. const contest_time = [...texl.matchAll(regexp_contest_time)];
  90. //コンテスト開始/終了時間を取得
  91. var start_time=contest_time[0][0].substr(34,17);
  92. var end_time=contest_time[1][0].substr(34,17);
  93.  
  94. if(arr_time.length==0){
  95. window.alert("Not Accepted by "+language);
  96. }
  97.  
  98. for ( i=0; i<arr_time.length ; i++) {
  99. var v_time=arr_time[i][0].substr(57,17)
  100.  
  101. // console.log(v_time)
  102. // console.log(start_time)
  103. if(v_time>=start_time&&v_time<end_time){
  104. var url=arr_url[i][0]
  105. url=url.replace('<a href="','')
  106. url=url.replace('">詳細</a>','')
  107. // console.log(url)
  108. window.open(url, '_blank'); // 新しいタブを開き、ページを表示
  109. break;
  110. }
  111. else if(v_time>=end_time){
  112. console.log('OK')
  113. window.alert("not solved in contest");
  114. var url2=arr_url[i][0].substr(9,37)
  115. window.open(url2, '_blank');
  116. break;
  117. }
  118. }
  119.  
  120. }
  121. }
  122. }
  123. console.log(submit_url)
  124. request.open('GET', submit_url, true);
  125. request.send(null);
  126. };
  127.  
  128.  
  129.  
  130. function create_button() {
  131. var parent = document.getElementsByClassName("h2");
  132. var a = document.createElement("a");
  133. a.textContent = "1st AC";
  134. a.setAttribute("class", "btn btn-default btn-sm");//AtcoderのCopyボタンと同じCSSを適用
  135. parent[0].appendChild(a);
  136. // a.addEventListener('mouseup', get_URL, false);
  137. a.addEventListener('mouseup', get_submit_URL, false);
  138. };
  139. create_button();
  140.  
  141.  
  142. })();
  143.