您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Check First submit Resolved in Contests
// ==UserScript== // @name Atcoder Check First AC // @namespace http://tampermonkey.net/ // @version 1.11 // @description Check First submit Resolved in Contests // @author tatetuke // @match https://atcoder.jp/contests/*/tasks/* // @match https://atcoder.jp/contests/*/submissions // @exclude https://atcoder.jp/contests/*/tasks/*/editorial // @icon https://atcoder.jp/* // @grant none // @copyright 2023, tatetuke (https://tatetuke.github.io/) // @license MIT License; https://opensource.org/licenses/MIT // ==/UserScript== (function() { 'use strict'; function get_URL(){ var contest_name=location.href console.log(contest_name) contest_name=contest_name.replace('https://atcoder.jp/contests/','') contest_name=contest_name.replace('/tasks/','') contest_name=contest_name.replace('/editorial','') var contest_name_num=contest_name.substr(contest_name.length/2-1,contest_name.length/2+1) contest_name=contest_name.substr(0,contest_name.length/2-1) //使用言語を取得 var language = document.getElementsByClassName("select2-selection__rendered"); //console.log(language) language=Array.prototype.slice.call(language)[0].innerText; language=language.substr(0, language.indexOf(' (')); if(language.indexOf(' ')!=-1){ language=language.substr(0, language.indexOf(' ')); } //console.log(language) //特殊文字を変換 language=language.replace( /\+/g,'%2B'); language=language.replace( /#/g,'%23'); var ret='https://atcoder.jp/contests/'+contest_name+'/submissions?f.LanguageName='+language+'&f.Status=AC&f.Task='+contest_name_num+'&f.User=&orderBy=created' // https://atcoder.jp/contests/abc297/submissions?f.LanguageName=C%2B%2B&f.Status=AC&f.Task=abc297_a&f.User=&orderBy=created // https://atcoder.jp/contests/joi2018ho/submissions?desc=true&f.LanguageName=C%2B%2B&f.Status=AC&f.Task=joi2018ho_a&f.User=&orderBy=created // window.open(ret, '_blank'); // 新しいタブを開き、ページを表示 console.log(language) return [ret ,language] }; function get_submit_URL(){ var query=get_URL() var submit_url=query[0] var language=query[1] console.log(language) // XMLHttpRequestオブジェクトの作成 let request = new XMLHttpRequest(submit_url); request.onreadystatechange = function(){ if (request.readyState == 4){ if (request.status == 200){ var contest_name=location.href contest_name=contest_name.replace('https://atcoder.jp/contests/','') contest_name=contest_name.replace('/tasks/','') var contest_name_num=contest_name.substr(contest_name.length/2-1,contest_name.length/2+1) contest_name=contest_name.substr(0,contest_name.length/2-1) var texl =request.responseText // console.log(texl) //提出コードをURL取得 // var regexp_sub_url=/<a href="\/contests\/....../\/submissions\/........">詳細<\/a>/g; var regexp_sub_url=new RegExp('<a href="\/contests\/'+contest_name+'\/submissions\/[0-9]{6,8}">詳細<\/a>','g'); //console.log(regexp_sub_url) // [0-9]{6~8} const arr_url = [...texl.matchAll(regexp_sub_url)]; // <a href="/contests/abc017/submissions/40929732">詳細</a> console.log(arr_url.length) //提出時間を取得(arr_urlと1対1対応) var regexp_sub_time=/<td class="no-break"><time class='fixtime fixtime-second'>........................<\/time><\/td>/g; const arr_time = [...texl.matchAll(regexp_sub_time)]; //コンテスト時間を取得 var regexp_contest_time=/<time class='fixtime fixtime-full'>........................<\/time>/g; const contest_time = [...texl.matchAll(regexp_contest_time)]; //コンテスト開始/終了時間を取得 var start_time=contest_time[0][0].substr(34,17); var end_time=contest_time[1][0].substr(34,17); if(arr_time.length==0){ window.alert("Not Accepted by "+language); } for ( i=0; i<arr_time.length ; i++) { var v_time=arr_time[i][0].substr(57,17) // console.log(v_time) // console.log(start_time) if(v_time>=start_time&&v_time<end_time){ var url=arr_url[i][0] url=url.replace('<a href="','') url=url.replace('">詳細</a>','') // console.log(url) window.open(url, '_blank'); // 新しいタブを開き、ページを表示 break; } else if(v_time>=end_time){ console.log('OK') window.alert("not solved in contest"); var url2=arr_url[i][0].substr(9,37) window.open(url2, '_blank'); break; } } } } } console.log(submit_url) request.open('GET', submit_url, true); request.send(null); }; function create_button() { var parent = document.getElementsByClassName("h2"); var a = document.createElement("a"); a.textContent = "1st AC"; a.setAttribute("class", "btn btn-default btn-sm");//AtcoderのCopyボタンと同じCSSを適用 parent[0].appendChild(a); // a.addEventListener('mouseup', get_URL, false); a.addEventListener('mouseup', get_submit_URL, false); }; create_button(); })();