AtCoder Show Me Score Table

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

As of 23/03/2024. See the latest version.

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

(async () => {
    // 配点 (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;
        });

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