imomoの勉強記録

主に勉強の記録などを残していきます

AtCoder向けのスクリプトを書いたお話

AtCoderの問題ページからコンテストIDを取得し、クリップボードに書き込むスクリプトを書きました。
とりあえずダウンロードしたい方はこちら

作成背景

環境構築

一か月ほど前、ojとatcoder-cliを使いたいなと思い、元々使っていたVisualStudioからwsl + vscodeで環境構築を行いvscodeで競プロをすることにしました。
問題ディレクトリの自動作成、テストケースのダウンロード&テスト、自動提出など競プロライフがとても快適になりました。
日々の精進にも生かすことができて、これまでより競プロに打ち込む時間が増えたと思います。

でもやはり人間、便利になったらさらに便利にしたいと思うようで…もっと楽に問題に取り組みたいと思い始めます。

コンテストID長い!!!

acc new [contestID] コマンドで問題ディレクトリ作成&サンプル自動ダウンロード機能を使用していて
通常のABCコンテストなどは打つの楽でいいのですが(正直少し面倒くさい)
企業コンや有志コンなどたまに長くて間違えたり面倒くさいなーとか思ってました。

なので、問題ページのコンテストIDをショートカットキーなどでクリップボードに書き込むスクリプト作れば楽なんじゃないかということで作りました。

ユーザースクリプトについて

とりあえずもう一回スクリプトのURL載せておきます。
greasyfork.org

コンテストIDのみ取得

やり方は簡単で、スクリプトをダウンロードしてから問題ページでショートカットキーを押すだけです
ショートカットキーはとりあえず押しやすいCtrl + Qとしていますが、Ctrlと合わせて押すキーは自由に設定可能です(ほかのショートカットと干渉するのは各自で対処お願いします)

Macユーザは、Command + 設定キーで動くようGoogleで検索して実装はしてありますがMacを持っていないので試すことができてないです。

(2020/11/29追記)
Macの方に試していただいた結果Macですとcommand + Qでは干渉してしまうらしく、chromeのショートカット設定を切るかcommand + Bなどにすると良いそうです!

その他機能

クリップボードに書き込んだことを通知するアラートを実装してありますが、邪魔な場合はユーザースクリプトのコードから設定を切ってください

ユーザースクリプトのコード部分では他に、各自用意した自動展開などを行うためのスクリプト名、問題番号(A問題、B問題などのこと)も同時にクリップボードに書き込む設定も用意しています。
(後で詳しく説明します)
これらを活用するともっと楽に問題に取り組むことができると思います!

その他機能についての詳細

vscodeを前提として書いているので、その他の方が取り組む場合は各自対応お願いします

何ができるか

簡単な流れを示すと、

  1. 解きたい問題ページでCtrl + Qを押して[スクリプト名] [コンテストID] [問題番号]を取得
  2. vscodeのターミナルでマウス右クリックして貼り付けして実行
  3. 自動で サンプルダウンロード&解きたい問題ページのソースファイル[main.cpp]をvscodeのエディタで開く 

とこんな感じで、問題ページを開いてからショートカット実行と貼り付けの2操作で問題を解く準備を整えることができます。

どんなスクリプトを書いてるか

#!/bin/bash
contest=$1
problem=$2
baseDir="/mnt/c/Users/****/Documents/vscode/AtCoder/study";

if [ -e $baseDir/$contest/$problem/"main.cpp"  ]; then
    echo "File exist";
    echo "open file";
    cd $baseDir/$contest/$problem;
    code "main.cpp";
else 
    echo "File not exist";
    echo "execute acc new command";
    cd $baseDir;
    acc new $contest; 
    cd $contest/$problem;
    code "main.cpp";
fi

(2020/12/01追記)
写真を実際のコードと差し替えました

簡単に説明すると
2行目:コンテストIDを引数として受け取る([ABC182]等)
3行目:問題番号を引数として受け取る([A]等)
4行目:精進用のディレクトリを指定
6-10行目:取り組む予定の問題が存在したら、ソースファイルを開く
12-17行目:存在しなかったら、acc newコマンドで問題&サンプルダウンロードしつつ、ソースファイルを開く
となっていて、例えばABC181-Bに取り組みたい場合

  1. practice.sh abc181 aをvscodeのターミナルで実行
  2. ファイルが存在するかどうか
  • 以前ABC181-Aに取り組んでおり、ファイルが残っている

   acc newコマンドは実行せず[精進ディレクトリ]/abc181/b.main.cppを開く

  • ファイルが存在しない

   acc newコマンド実行後、[精進ディレクトリ]/abc181/b.main.cppを開く

のようになります。

他の設定など

私はこんな感じで使っています

f:id:iiiimmmmo:20201115144914p:plain
設定項目

最後に

できる限り対応したつもりですが、古い問題などで一部正常に動作しないこともあります(これとか)
今回のユーザスクリプトはもともと自分用に作成したので何か不便な点があるかも知れませんが、自分の実力の及ぶ範囲でなら直していきたいと思います。
何かあればtwitterにてご連絡ください。

拙い文でしたが読んで下さりありがとうございました。