Python競プロerのためのテスト環境構築 with Atom


対象とする人

これから Python で競技プログラミングを始める方や,すでに競プロerだけどテスト環境を持っていないよって人のための記事です.テスト環境の作り方の記事が見当たらなくて困ったので書きました.単純に標準入力の受け方が知りたい人は以下の記事がまとまっていてすごくいいです.

Pythonで競プロやるときによく書くコードをまとめてみた

例えば入力として

N M
s1 t1 w1 
s2 t2 w3
...
sN tN wN

のような複数行の入力があるとき,実行のたびにこれを打ち込むのはとてもとてもつらいです….この記事では Atom でローカルのテスト環境を作っていきます.VSCode などを使っている人は普通にターミナルが使えると思うので、Powershellで実行する から読み進めてください.ただしMacやLinuxの人は

python spam.py < input.txt

という風に入力データをtextファイルに書いておいて,リダイレクトして読み込むだけでいいみたいです.お疲れさまでした.以下 Windows10 を想定します.

Atom と package の導入

以下の記事を参考に Atom と package platformio-ide-terminalの導入をしてください(atom・pythonで競技プログラミングのテスト環境構築).これで Atom から簡単に PowerShell を起動できるようになります.

上にあげた記事では

import sys
f = open('input.txt', 'r')
sys.stdin = f

x = input()
print(x)

のようにしてファイルから標準入力を受け取っていますが,競プロではこのまま提出できないので少し不便です(批判しているわけではないです).ローカルでテストしてそのまま提出できることを目標にします.

PowerShellで実行する

Windows ではpython spam.py < input.txt の代わりに

Get-Content ./input.txt | python ./spam.py

のように実行できます.PowerShell は Atom 下部の [+] から起動できます(下の図).

毎回これを打ち込むのは面倒くさいのでスクリプトを書いてさぼります.これから PowerShell スクリプトを作りますが難しくないので初めてでも大丈夫です.(私もこれが2回目なので…)

スクリプトをかいてラクしたい

先ほどのコードを実行する PowerShell スクリプトtest.ps1を書きます.

test.ps1
Get-Content ./input.txt | python ./spam.py

注意点ですが PowerShell ではカレントディレクトリであっても相対パスを明示しないとだめです.hoge.txt ではなく ./hoge.txt のように書きましょう(自戒).

実は PowerShell スクリプトはこのままでは実行できません.実行ポリシーを変更しないと実行できないようになっているからです.そこで Atom から Powershell を起動したら自動的に実行ポリシーを変更するようにします.Atom の [file]->[setting]->[Packages]->[platformio-ide-terminal]->[Core]->[Auto Run Command] に

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

を追加します.必要があれば [Working Directrory] も変更しておくといいかもです.私は [Active File] にしました.

これで準備ができました!!!

試してみる!

spam.py
import sys
N,M = map(int, sys.stdin.readline().split())
print(N, M)
for _ in range(M):
    s,t,w = map(int, sys.stdin.readline().split())
    print(s,t,w)
input.txt
5 3
0 1 4
0 2 3
1 1 2

準備ができたらAtom から PowerShellを開いて,test.ps1を実行してみてください.標準入力を正しく受け取れたでしょうか?

最後に

経験が浅いので,こうしたほうがいいよという指摘などお待ちしております m(__)m.またわかりにくい点は気軽に聞いてください!

参考

PowerShellのリダイレクト
PowerShellスクリプティングの第一歩