feature image

2026年3月16日 | ブログ記事

【簡単】ユーザースクリプトで有意義な競プロライフを【Tampermonkey】

はじめに

この記事は新歓ブログリレー2026 11日目の記事です。

こんにちは!25B の @o_o です
みなさんは AtCoder で問題を解くとき、ユーザースクリプト使っていますか?

こういうのとか

こういうの

使ってない方はインストールの方法を検索してみてください。丸投げです。

使っている方へ、
問題を解くときにちょっと不便だな、でもそれを改善するユーザースクリプトないなってなったことはありませんか?
私は普段このように画面を二つに分けているのですが、コンテスト名が見えないのが不便だなと思っていました。(大きいディスプレイを使うべき)

左側にでかでかとコンテスト名が見えてほしいですよね。

Tampermonkey ってなに

簡単に言うと、今見ているWebページの見た目や動きを、好きなように簡単に改造できちゃうブラウザ拡張機能です。間違っていたらごめんなさい

JavaScriptを書くことで、特定のサイト(今回ならAtCoder)を開いたときに、自動で自分の用意したプログラムを走らせることができます。
「ここにボタンが欲しいな」「この文字もっと大きくしたいな」「コンテスト名をでかでかと表示させたいな」みたいなことをめんどくさいことを無視して書けちゃいます!

どうやって書くの

Tampermonkey インストールされていますか?
インストールされているなら

ここの「新規スクリプトを追加...」ボタンを押して

こんな画面が開かれたら成功です!

ご丁寧に Your code here... とあるのでここに自分のコードを書いたら動きます!

以下が書いたコードです

// ==UserScript==
// @name         atcoder Problem Name Inserter
// @namespace    http://tampermonkey.net/
// @version      2025-12-13
// @description  window サイズが小さくてもコンテスト名が表示されるようにします
// @author       You
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const contestId = location.pathname.split("/")[2].toUpperCase()

    const markup = `
  <div id="contest-name"
  class="h3">
  ${contestId}
  </div>
  `;

  document.querySelector("#contest-nav-tabs + div").insertAdjacentHTML("afterbegin", markup);
})();

解説

やっていることは、ざっくり以下の4ステップです!誰でもできちゃいますね

1. 説明とか書く

ここではどのページでこのプログラムを実行するのかや表示名、説明を書きます。
公開する予定がないのであれば以下だけ書けば大丈夫です。

// ==UserScript==
// @name         atcoder Problem Name Inserter
// @namespace    http://tampermonkey.net/
// @version      2025-12-13
// @description  window サイズが小さくてもコンテスト名が表示されるようにします
// @author       You
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none
// ==/UserScript==

name

こんな感じで表示されます。自分がわかれば問題ないです。

description

ホバーすると出てきます。自分がわかれば問題ないです。

match

一番重要です!どのページで実行するかを指定します。
https://atcoder.jp/contests/*/tasks/* のようにどんなものでもいいところを * にして書きます。

1. URL からコンテスト名を持ってくる

コンテスト名を表示したいので、URL から引っ張ってきましょう

const contestId = location.pathname.split("/")[2].toUpperCase()

location.pathname で現在のURLのパス(例: /contests/abc000/tasks/abc000_a) を取得します。
それを split("/")/ ごとに切り刻み、3番目の要素(インデックスは [2])を取り出しています。
コンテスト名はやっぱり大文字のイメージがあるので、最後に toUpperCase() を使って、小文字を大文字(abc000 → ABC000)に変換しています

2. 差し込みたい HTML 要素を定義する

先ほど取得した contestId を使って、画面に表示させるための DOM の中身を markup という変数に用意します。AtCoder の既存のデザインに馴染むように class="h3" を指定して、いい感じの大きさの見出しになるようにしています。

3. 差し込みたい場所を探して差し込む

ブラウザの開発者モード使って差し込む場所を特定します。
querySelector はページ内で一番最初に一致した要素を取得できます。id やクラス名で指定できるため、差し込みたい場所の周辺で他とかぶってなさそうなところを選択します。
今回は contest-nav-tabs を選択しました。

この contest-nav-tabs の次の div のすぐ内側、最初の子の前に差し込みたいため、querySelector("#contest-nav-tabs + div")で指定します。
次に、insertAdjacentHTML("afterbegin", markup)で差し込みます。
insertAdjacentHTML には afterbegin のほかにも引数はあるので適切なものを選んでください。

https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentHTML#引数

おわりに

できました!!!
見た目にそこまでこだわらない自分用の簡単な機能であればこれだけでできちゃいます!

皆さんもぜひ、ユーザースクリプトで快適な競技プログラミングライフを送りましょう!

明日の投稿者は@zoi_dayo さんです!

o_o icon
この記事を書いた人
o_o

25B / 鳩でもできる

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2024年9月20日
2024年 1-Monthonを開催しました!!
Synori icon Synori
2021年5月16日
CPCTFを支えたインフラ
mazrean icon mazrean
2024年7月20日
部員の活動紹介サービス traPortfolio をリリースしました
mehm8128 icon mehm8128
2026年4月8日
実際無料プラグインってどうなの?って話
vPhos icon vPhos
2026年3月20日
2048でショートコーディング
quarantineeeeeeeeee icon quarantineeeeeeeeee
2026年3月18日
Grafana ObservabilityCON on the Road 参加記
Pugma icon Pugma
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記