VSCodeでの競プロ向けPython環境をWindowsで作る

下記を前提とします。記事作成時の手元のバージョンも一応書いておきます。

* Windows10
* VSCodeインストール済み(1.40.1)
* Windows版のPythonインストール済み(3.8.0)
  * Python導入後のWindowsに右記もインストール済み⇒[online-judge-tools](https://github.com/kmyk/online-judge-tools/blob/master/docs/introduction.ja.rst)

# ゴール
`Ctrl+Shift+B`でサンプルケースでのテスト実行できて、
`Ctrl+Shift+T`で手入力でのテスト実行できる環境を作ります。

# フォルダー構成
以下のようにしました。1問ごとに1ファイルとして、全部src以下に放り込みます。

```
work
│  cptest.bat
│  input.txt
│
├─.vscode
│      launch.json
│      settings.json
│      tasks.json
│
├─src
│      abc114_a.py
│
└─test
```

## cptest.bat

```bat:cptest.bat
@echo off

set problemname=%1
set testdir=test\%problemname%
set baseurl=%problemname:~0,-2%
set baseurlreplaced=%baseurl:_=-%

rem # log in
oj login -u username -p password "https://atcoder.jp/"
oj login --check "https://atcoder.jp/"

rem # make test directory
if not exist %testdir% (
  oj dl -d test/%problemname%/ https://atcoder.jp/contests/%baseurlreplaced%/tasks/%problemname%
)

oj test -c "python src/%problemname%.py" -d test/%problemname%/
```

### 説明
`cptest.bat abc114_a`のように引数を一つ与えて動かすバッチファイルです。
なお、`cptest.bat ddcc2020_qual_a`でも動くように無理やり変換処理を入れています。
`oj login -u`の行にある`username`や`password`は適切に変更してから使います。
最後の行では`python`コマンドにパスが通っていることを前提に、ゴリゴリと実行して結果を標準出力に吐き出します。

## input.txt

```text:input.txt
(標準入力として渡したい内容を書く)

```


### 説明
`python xxxxx.py < input.txt`のように使うテキストファイルです。
自前でテストしたい入力を気合で書きます。

## launch.json

```json:launch.json
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "args": [
        "<",
        "input.txt"
      ]
    }
  ]
}
```

### 説明
`F5`でデバッガを走らせるための設定ファイルです。
以下は作り方：
.pyファイルを開いてから唐突に`F5`を押せばデバッグを開けます。
下記のような画面の「構成の追加」を押すと`launch.json`ひな形が用意できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61504/15d4eda4-f6d0-285e-3a6c-b1b5f60f8142.png)
用意されたひな形に`args`のあたりを記載してあげれば完成です。

## tasks.json
```json:tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "test_atcorder_sample",
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "type": "shell",
      "command": "${workspaceFolder}/cptest.bat",
      "args": [
        "${fileBasenameNoExtension}"
      ],
      "problemMatcher": []
    },
    {
      "label": "test_manual_input",
      "group": {
        "kind": "test",
        "isDefault": true
      },
      "type": "shell",
      "command": "python",
      "args": [
        "${file}",
        "<",
        "input.txt"
      ]
    }
  ]
}
```

### 説明
`Ctrl+Shift+B`(ビルドタスク)や`Ctrl+Shift+T`(テストタスク)を書いておく設定ファイルです。
以下は作り方：
.pyファイルを開いてから唐突に`Ctrl+Shift+B`を押せば下記のような画面が出てきて`tasks.json`のひな形が用意できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61504/67d3e9fb-9bdc-bd4f-b252-97e65f573587.png)
用意されたひな形をゴリゴリと編集しまくって完成です。

## abc114_a.py
```python:abc114_a.py
def main():
    x = int(input())
    ans = "NO"
    if (x == 7 or x == 5 or x == 3):
        ans = "YES"

    print(ans)

if __name__ == '__main__':
    main()
```

### 説明
`[コンテスト名]_[問題名].py`となるようにファイル名を気を付けます。
上記の場合、ABC114のA問題を解くコードを書きます。


# 運用
コンテストに合わせて、適切なファイル名の.pyファイルをsrc以下に作ります。
回答を作ったら、`Ctrl+Shift+B`でサンプルケースの動作確認をして、よかったらそのまま提出します。
怪しい箇所に気が付いたら`input.txt`を適宜変えつつ、`F5`や`Ctrl+Shift+T`での動作確認しつつ修正して提出します。

# 参考
[Visual Studio Codeで競プロ環境構築(実践編) - Qiita](https://qiita.com/AokabiC/items/af685bfd205dda44ec45)