AtCoder Show Me Score Table

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

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name        AtCoder Show Me Score Table
// @namespace   https://atcoder.jp/
// @version     0.4
// @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;
        });

    // キャッシュする
    if (res[0] !== "?") {
        localStorage.setItem(`score_table_${contestScreenName}`, res);
    }

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