毎度のごとくMacを初期化しまして、AtCoderの環境も再構築が必要になったのでこれを機に記事でも書くかと私の使っていたVSCodeでAtCoderの環境を作っていきたいと思います。
Mac + Python + 提出ショートカットの記事も無かったのでね。。。(もちろんC++などPython以外、Mac以外でも役に立ちます)
Macの環境
プロセッサだったりOSだったりの情報は以下です。
ハード情報
- MacBook Pro(2018年モデル)
- Intel プロセッサ
ソフト情報
- MacOS Monterey
- シェルはzsh
- ほぼほぼ初期化した状態でChromeやらbrew、python、node.jsだけ入れた
AtCoder-cliのインストール
AtCoder-cliのインストールからです。
これにはNode.jsが必要なのでまだインストールできていない人はこちらを参考にインストールしてください。
インストールしている方は以下のコマンドを打ってatcoder-cliをインストールしてください。
sudo npm install -g atcoder-cli
インストールが終わったら
acc --version
でバージョンが表示されるか確認しましょう!
accのアップデートチェックにエラーがあると表示される方は指示に従い
sudo chown -R $USER:$(id -gn $USER) /Users/[パソコンのユーザー名]/.config
を実行して権限を与えます。
online-judge-toolsのインストール
online-judge-toolsをインストールしていきます。
インストールにはpipコマンドが使える環境が必要ですので、AtCoderでC++などpython以外を使っている方もpythonインストールが必要です。
pythonをインストールしていない方はこちらからインストールを行なってください。
インストールができたら
pip3 install online-judge-tools
こちらのコマンドでonline-judge-toolsをインストールします。
こちらも
oj --version
でバージョンが表示されたらOKです。
AtCoder-cliのログイン
AtCoder-cliとonline-judge-toolsのインストールが出来たら、AtCoder-cli(以下acc)にログインしましょう。
acc login
と打ってAtCoderのユーザー名とパスワードを入力します。
OK
と表示されるはずです。
online-judge-toolsのログイン
online-judge-tools(以下oj)にもログインします。
oj login https://atcoder.jp
このコマンドを打ってAtCoderのユーザー名とパスワードを入力します。
「Seleniumが無い」とのエラーが出ますが問題なく動きますので機になる人はインストールしてください。
私は普通に使うのでインストールしました。
解答のテンプレを作成
問題を取得した際に解答のテンプレもあった方が素早くコーディングできると思いますのでテンプレを作成していきます。
cd `acc config-dir`
mkdir python
cd python
touch main.py
touch template.json
このコマンドを入力します。
main.pyには
import math
from collections import defaultdict
などなど好きなようにテンプレを作っておきます。
(ちなみに私は空です笑)
template.jsonには
{
"task":{
"program":["main.py"],
"submit":"main.py"
}
}
を入力します。保存も忘れずに。
acc config default-template python
でデフォルトでpythonフォルダのテンプレを使う様にします。
acc config default-task-choice all
この設定も行う事で、abcdefgなど問題を全て取ってきてくれるのでした方がいいでしょう。
とりあえず確認
まだやることはありますが一旦確認しておきます。
acc new abc100
とやるとabc問題の100を取ってきます。
この問題のIDはコンテストのURL部分ですので覚えておきましょう。
実行するとabc100というディレクトリができて、その中にabcd問題まであり、さらにその中にmain.pyというテンプレとtestsディレクトリがあると思います。
.
└── abc100
├── a
│ ├── main.py
│ └── tests
├── b
│ ├── main.py
│ └── tests
├── c
│ ├── main.py
│ └── tests
├── d
│ ├── main.py
│ └── tests
└── contest.acc.json
そこまで確認できればひとまずOKです。
本番はmain.pyにコードを書いていきます。
# abc100 A問題の解答
a,b=map(int,input().split())
print(":(" if a>8 or b>8 else "Yay!")
テストの確認をしたいのでa問題の解答は載せておきます。
自動テストとショートカット
自動テストを行うには、abc100のA問題を例にすると
oj t -c 'python3 abc100/a/main.py' -d abc100/a/tests/
というコマンドを実行する必要があるのですが、これを毎回打っていると時間がかかるのでショートカットを設定します。
まずは、ショートカットで実行するタスクとして設定しなければいけないので.vscode
ディレクトリを作成しtasks.json
を作成します。
.
├── .vscode
│ └── tasks.json
└── abc100
├── a
├── b
├── c
├── d
└── contest.acc.json
こんな感じになればOKです。
{
"version": "2.0.0",
"tasks": [
{
"label": "CheckTestCase",
"type": "shell",
"command": "cd ${fileDirname} && oj t -c 'python3 main.py' -d ./tests/",
"presentation": {
"reveal": "always",
"focus": true,
"panel": "shared"
}
}
]
}
tasks.jsonの中には上のものを追加してください。
次にcmd + K
cmd + S
を順に押してキーボードショートカットを開きます。
以下の画像の様にもいけます。
そしたら
この真ん中のマークを押します。
これでkeybindings.json
が開くと思うのでそこに
[
{
"key": "ctrl+t",
"command": "workbench.action.tasks.runTask",
"when": "editorTextFocus",
"args": "CheckTestCase"
}
]
上のものを入力して保存します。
この状態でabc100/a/main.py
を開いた状態でcontrol + T
を押すと、、、
こんな感じでテストケースを全て試してくれます。
自動提出とショートカット
ここまできたら提出も自動でできる様にしましょう。
{
"version": "2.0.0",
"tasks": [
{
"label": "CheckTestCase",
"type": "shell",
"command": "cd ${fileDirname} && oj t -c 'python3 main.py' -d ./tests/",
"presentation": {
"reveal": "always",
"focus": true,
"panel": "shared"
}
},
{
"label": "SubmitCode",
"type": "shell",
"command": "cd ${fileDirname} && acc s ${fileBasename}",
"presentation": {
"reveal": "always",
"focus": true,
"panel": "shared"
}
}
]
}
tasks.json
を以上のように変更します。そのままコピペで大丈夫です。
[
{
"key": "ctrl+t",
"command": "workbench.action.tasks.runTask",
"when": "editorTextFocus",
"args": "CheckTestCase"
},
{
"key": "ctrl+s",
"command": "workbench.action.tasks.runTask",
"when": "editorTextFocus",
"args": "SubmitCode"
}
]
keybindings.json
は以上の様に変更します。そのままコピペで大丈夫です。
どちらも保存忘れないように。
これでabc100/a/main.py
を開いた状態でcontrol + S
を押します。
(事情により画像は出せないですが)abcaと入力してと出てくるので入力します。
おわりに
出来るだけ分かりやすく説明したつもりなのですがどうでしたかね?
少しでもよければLGTMしてくれると嬉しいです。
また何かあれば記事にします。
それでは良いAtCoderライフを!