您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
提出フォームの上にペナルティ率を表示して、提出前に確認しやすくします
// ==UserScript== // @name AtCoderPenaltyRateCheckEaser // @namespace http://tampermonkey.net/ // @version 0.2.2 // @description 提出フォームの上にペナルティ率を表示して、提出前に確認しやすくします // @author Masaoki Seta // @match https://atcoder.jp/contests/*/tasks/* // @license MIT // ==/UserScript== function getStandingsData(contestName) { const REQUEST_URL = `https://atcoder.jp/contests/${contestName}/standings/json`; return $.ajax({ type: 'GET', url: REQUEST_URL, dataType: 'json', }) .fail(() => console.error(`AtCoderPenaltyRateCheckEaser: Could not get data in function, getStandingsData. Request URL : ${REQUEST_URL}`)); } $(() => { 'use strict'; if (!'contestScreenName' in window) { console.error('AtCoderPenaltyRateCheckEaser: Could not get contestScreenName.'); return; } function gotPenalty(preblemData) { if (preblemData.Penalty > 0) return true; if (preblemData.Failure > 0 && preblemData.Status !== 1) return true; return false; } function gotCorrect(preblemData) { return preblemData.Status === 1; } const PROBLEM_NAME = location.href.split('/').pop(); getStandingsData(contestScreenName).done((res) => { const standingsData = res.StandingsData; let totalCount = 0, penaltyCount = 0, acCount = 0; standingsData.forEach((userData) => { const problemData = userData.TaskResults[PROBLEM_NAME]; if (problemData == null) return; totalCount++; if (gotPenalty(problemData)) penaltyCount++; if (gotCorrect(problemData)) acCount++; }); const panaltyRate = penaltyCount * 100/totalCount; const panaltyRateStr = totalCount > 0 ? (panaltyRate).toFixed(2) + '%' : 'No Submit'; const makeRateStyle = ((rate) => { let style = ''; if (rate >= 33.3) style = 'background: red;'; else if (rate >= 20.0) style = 'background: yellow;'; return style; }); const panaltyRateStyle = makeRateStyle(panaltyRate); const acRate = acCount * 100 / totalCount; // const acRateStr = totalCount > 0 ? (acRate).toFixed(2) + '%' : 'No Submit'; // const acRateStyle = makeRateStyle(acCount); $('.form-horizontal.form-code-submit').prepend(` <div> <table id="acsa-table" class="table table-bordered table-hover th-center td-center td-middle"> <thead> <th style="width: 34%">ノーペナ者数/提出者数</th> <th style="width: 33%">ペナルティ率</th> <th style="width: 33%">正解者数/提出者数</th> </thead> <tbody> <td>${ totalCount - penaltyCount }/${ totalCount }</td> <td style="${ panaltyRateStyle }">${ panaltyRateStr }</td> <td>${ acCount }/${ totalCount }</td> </tbody> </table> </div> `); }); });