対象とする人
これから Python で競技プログラミングを始める方や,すでに競プロerだけどテスト環境を持っていないよって人のための記事です.テスト環境の作り方の記事が見当たらなくて困ったので書きました.単純に標準入力の受け方が知りたい人は以下の記事がまとまっていてすごくいいです.
例えば入力として
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
を書きます.
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] にしました.
これで準備ができました!!!
試してみる!
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)
5 3
0 1 4
0 2 3
1 1 2
準備ができたらAtom から PowerShellを開いて,test.ps1
を実行してみてください.標準入力を正しく受け取れたでしょうか?
最後に
経験が浅いので,こうしたほうがいいよという指摘などお待ちしております m(__)m.またわかりにくい点は気軽に聞いてください!