見出し画像

AtCoderで快適に戦うための環境を作ろう

はじめに

こんにちは。ソフトウェアエンジニアの大橋(X: @m_asa_o)です。

競技プログラミング(以下、競プロ)が好きで、AtCoderのレートは緑色です。緑色になってからは思うようにレートが上がらず、コンテストを一時期敬遠してしまっていたのですが、最近再び水色を目指して勉強し始めています。

この記事では、AtCoderで快適に戦うために、私が実際に行っている環境構築の内容と手順を紹介します。



なぜ環境構築が必要か

もしAtCoderで何も環境構築していない状態だと、典型的なコード提出までの流れは以下のようになります。

1. 問題タブまたは提出タブのエディタでコーディングする
2. コードテストタブに切り替えて、エディタで書いた解答をコピペする
3. 入力例をコピペして、コードテストを実行し、結果を確認する(※サンプルテストケースが3つなら、3回繰り返す)
4. 問題タブまたは提出タブに戻り、コードの修正箇所があれば直して提出する

この手順には、以下のようなデメリットがあります。

・画面の切り替えや操作が煩雑
・ミスが起こりやすい(古いコードを提出する、提出する問題を間違えるなど)
・エディタの性能が低い

これらの問題を解決し、快適に競プロに取り組むためには、まず環境構築を行うことがおすすめです。

環境構築と聞くと大変そうなイメージを持たれる方が多いのではないかと思いますが、実はものすごく手軽に快適な環境を構築できる方法もあります。

そこで本日は、以下の2つの手法を紹介します。

1. Chrome拡張機能を入れる(お手軽)
2. ローカルで環境構築する(やや面倒)

特にAtCoderを始めたての方に勧めたいのは1つ目の方法です。得られる快適性に対して環境構築の手間が格段に少ないので、真っ先に行うのが良いです。


1. Chrome拡張機能を入れる

使うもの

AtCoder Easy Test v2(スクリプトマネージャが必要)
Tampermonkey(スクリプトマネージャ)

<注意>Tampermonkeyは、ユーザースクリプトを実行するためのChrome拡張機能です。この拡張機能自体は危険なものではないですが、作成元が信頼できないスクリプトを実行するようなことがないよう、くれぐれもお気をつけください。

概要

問題タブでコーディングして、「Test&Submit」を押すだけで、すべての入力例のコードテストを実行して、全て通っていたら自動で提出してくれます。

あくまでテストと提出を自動化してくれるものなので、エディタはデフォルトのままです。コーディングはローカルのエディタで行って、コピー&ペーストして使うことがおすすめです。

↑ボタン1クリックで、全てのサンプルケースについて一括で動作確認をすることができます。


環境構築方法

詳しい導入方法と使い方は、拡張機能の製作者の方が執筆されたQiitaをご覧ください。

AtCoder Easy Test を支える技術 - Qiita

補足

AtCoderには、有志のプログラマによって開発された便利ツールが多数存在します。これらはユーザースクリプト形式で配布されていることが多いです。

そのため、Tampermonkeyのようなスクリプトマネージャを入れておくと、AtCoder Easy Test v2以外にも有用なツールをたくさん導入することができます。

筆者は順位表の機能を拡張するAtCoderStandingsAnalysisac-predictor

AtCoderPerformanceColorizerなどのユーザースクリプトが気に入っています。

※ユーザースクリプトの導入にはリスクを伴うので、安全性についてよく調べた上で、慎重に検討することを推奨します。


2. ローカル環境構築をする

使うもの

atcoder-cli
    ・ローカルに問題セットと入力例/出力例をダウンロードできる
    ・コマンドライン経由で解答を提出できる
online-judge-tools
    ・ローカルでテストできる

概要

ローカルのターミナルで、コーティングから提出まで全てが完結するので、好きなエディタが使えます。エディタでコードを書いた後、そのままコマンドライン経由でテストと提出ができます。
エディタの拡張機能と組み合わせれば、コード補完やLinter/Formatterを効かせたり、Copilotを使ったりすることも可能です。

環境構築方法

事前準備(Mac)

以下をインストールします。

Homebrew
Python(pip3)
Node.js(npm)

インストール(Mac)

基本的には公式のインストールガイドに従えばOKです。

参考までに、筆者が実施した手順を書き記します。

事前準備を済ませたうえで、以下のコマンドを実行します。

$ pip3 install online-judge-tools
$ npm install -g atcoder-cli

以下のコマンドを実行して、atcoder-cliとonline-judge-toolsがインストールされていることを確認します。

$ acc -h
$ oj -h

online-judge-toolsがインストールされていれば、atcoder-cliは自動的にそれを検知します。

以下のコマンドで連携できているか確認します。

$ acc check-oj


これでインストールは完了です。

初期設定

atcoder-cli, online-judge-toolsのそれぞれで、AtCoderのユーザーIDとパスワードでログインします。

$ acc login
$ oj login https://beta.atcoder.jp/

任意の場所に、AtCoder用のディレクトリを作成します。参考までに、筆者は`~/workspace`直下に作成しています。

$ mkdir atcoder


ここまで行えば、基本的な環境構築は完了しますが、さらに快適に使うために続けて設定を行います。
設定内容については、こちらの記事を参考にさせていただきました。

RubyプログラマがAtCoderの環境をatcoder-cliとonline-judge-toolsで快適にしてみた - Qiita

便利設定1. 問題の一括ダウンロード

`acc n`コマンドでコンテスト用のディレクトリを作成する際、自動的に全ての問題がダウンロードされるよう設定しておきます。

$ acc config default-task-choice all

便利設定2. 提出用ファイルの自動作成

問題ごとに提出用ファイルも自動作成されるようにしておきます。

$ cd `acc config-dir`
$ pwd
Users/xxxxxx/Library/Preferences/atcoder-cli-nodejs

設定ディレクトリに移動したら、普段使う言語のテンプレートファイルを作成します。筆者は普段Rubyを使うので、ディレクトリ名はRuby、プログラムの拡張子はrbとしています。

$ mkdir ruby && cd ruby
$ touch template.json
$ touch main.rb

template.jsonは以下のように設定します。

{
  "task": {
    "program": ["main.rb"],
    "submit": "main.rb",
    "testdir": "test"
  }
}

main.rbには、テンプレートとして使いたいソースコードを保存しておきます。

#!/usr/bin/env ruby
N, *A = $<.read.split.map &:to_i
(N, M), *AB = $<.map{ _1.split.map &:to_i }

最後にこのテンプレートがデフォルトで使われるように設定すれば完了です。

$ acc config default-template ruby

便利設定3. テストコマンドのエイリアス登録

与えられたサンプルケースについてテストをするには、毎回同じコマンドを打つことになるので、あらかじめエイリアスを設定しておきます。筆者はzshを使っているので、 `~/.zshrc` に以下を記載しています。

alias ojt='oj t -c " ruby main.rb" -d test'


コンテストに出る

ここまで行えば、コーディングから問題の提出まで全てコマンドライン上で完結させることができます。過去に開催されたコンテストはもちろん、開催中のコンテストであっても問題なく提出できます。

コンテストに取り組む際、まずは以下のコマンドで問題セットをダウンロードします。21:00開催のコンテストであれば、21:00からダウンロード可能になります。

$ cd ~/workspace/atcoder    # 自身の作業ディレクトリに移動
$ acc n abc353

これでabc353の各問題用のディレクトリが作成されます。

main.rbには前の手順で作成したテンプレートが反映されているので、これを編集してコーディングしていきます。

コーディングが完了したら、エイリアスとして登録した`ojt`コマンドで、与えられたサンプルケースに対するテストを実行します。

$ cd abc353/a    # 問題ディレクトリに移動
$ ojt

解答が提出できる状態になったら、`acc s`コマンドで問題を提出します。なお、提出時に必ず確認文字列の入力が求められるので、`acc s`コマンド後、即座に入力してreturn(Enter)キーを押しておくと、待たされることがなく快適です。(ABCのA問題ならabca、B問題ならabcb、といった具合です)

$ acc s
...
[WARNING] the problem "https://atcoder.jp/contests/abc353/tasks/abc353_a" is specified to submit, but no samples were downloaded in this directory. this may be mis-operation
Are you sure? Please type "abca"

確認用の文字列を入力すると、AtCoderのサーバーに解答が送信され、自動的にブラウザで提出結果画面が開きます。


おわりに

生成AI全盛の現在、競プロそのものに意義を見出せなくなっている方もいるのではないかと思います。ですが、学んだ考え方やアルゴリズムをアウトプットする場として活用できることに変わりはなく、私個人としては日々の業務から少し離れた頭の体操ができるツールとして重宝しています。

日進月歩で生成AIのコーディング能力が進化している今だからこそ、過度にレートを気にせず、楽しんで競プロに取り組むことの重要性がこれまで以上に高まっていると感じています。

ここまで読んでくださった皆様にとって、本記事が快適な競プロライフを送るための一助となれば幸いです。ありがとうございました。


ワンキャリアでは一緒に働く仲間を募集しています。詳しくは以下をご覧ください。

▼ワンキャリアのエンジニア組織のことを知りたい方はまずこちら

▼カジュアル面談を希望の方はこちら

▼エンジニア求人票


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?