AtCoder Show Me Score Table

コンテスト名を配点に置き換えちゃうスクリプト

Version au 13/10/2024. Voir la dernière version.

// ==UserScript==
// @name        AtCoder Show Me Score Table
// @namespace   https://atcoder.jp/
// @version     0.3
// @description コンテスト名を配点に置き換えちゃうスクリプト
// @author      hayatroid
// @license     MIT
// @match       https://atcoder.jp/contests/*
// @exclude     https://atcoder.jp/contests/*/json
// ==/UserScript==

(async () => {
    // キャッシュを読み込む
    const cache = localStorage.getItem(`score_table_${contestScreenName}`);
    if (cache) {
        document.querySelector(".contest-title").textContent = cache;
        return;
    }

    // 配点 (e.g. "100 - 200 - 300 - 400 - 500 - 600") の取得
    const res = await fetch(`https://atcoder.jp/contests/${contestScreenName}`)
    .then((response) => {
        if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
        return response.text();
    })
    .then((text) => {
        const parser = new DOMParser();
        const doc = parser.parseFromString(text, "text/html");
        // 配点の書かれた table の取得
        const table = [...doc.querySelectorAll("#contest-statement > .lang > .lang-ja table")]
        .filter((element) => {
            const th = [...element.querySelectorAll("thead > tr > th")];
            return th.length === 2 && th[0].textContent === "問題" && th[1].textContent === "点数";
        });
        if (table.length !== 1) throw new Error("Scoreboard cannot be found.");
        return table[0];
    })
    .then((table) => {
        // table から配点を取り出し,ハイフンでつなぐ
        const res = [...table.querySelectorAll("tbody > tr > td")]
        .filter((element, index) => {
            return index % 2 === 1;
        })
        .map((element) => {
            return element.textContent;
        })
        .join(" - ");
        return res;
    });

    // キャッシュする
    localStorage.setItem(`score_table_${contestScreenName}`, res);

    // コンテスト名を配点に置き換える
    document.querySelector(".contest-title").textContent = res;
})();