AtCoderってinput()で入力を受け取って、print()で結果を出力しているので
- 入力元をファイルにして
- 出力先をio.StringIOにすれば
検証用プログラム自作できるよね、ってことで、ちょっと雑なプログラムですが作ってみました。
try.py
- 検証用プログラムを特定の位置にコピペするっていう雑なやり方
- 日本語の正規化にneologdn使ってます(AtCoderなら要らないはず)
- data/in*.txtに入力データ、data/out*.txtに正解データが出力されており、それらを検証に使用しています。
badなノウハウ
- 最初はNotebookでやろうと思ったんですが標準入力と標準出力を切り替えられなかったので断念しました。
- .pyファイルで作っています。
というわけでソースはコチラ(try.py)
import glob
import sys, os
from io import StringIO
import neologdn
in_path_all = sorted(glob.glob("data/in*.txt"))
def try1_func():
# ここに提出コードをコピペする。
# input()はinXXX.txtに、print()はStringIOにそれぞれリダイレクトされ、検証されます
def try_all():
error_count = 0
for in_path1 in in_path_all:
out_path1 = in_path1.replace("in","out")
# print(out_path1)
stdout_io = StringIO()
with open(in_path1,"r") as f_in:
sys.stdin = f_in
sys.stdout = stdout_io # 標準出力を io に結びつける
try1_func()
sys.stdout = sys.__stdout__ # 標準出力を元に戻す
with open(out_path1,"r") as f_out:
all_output = f_out.readlines()
all_temp = stdout_io.getvalue().split('\n')
for out_str1 in all_output:
stdout_str1 = neologdn.normalize(all_temp.pop(0)) # neologdnで正規化してから比較する
out_str1 = neologdn.normalize(out_str1) # neologdnで正規化してから比較する
if out_str1 != stdout_str1:
print(f"Error! temp={stdout_str1}, answer={out_str1}, in_path={in_path1}")
error_count += 1
else:
print(f"OK temp={stdout_str1}, answer={out_str1}")
pass
print("AC" if error_count == 0 else "WA")
if __name__ == "__main__":
try_all()
徒然なる補足
- 日本語の正規化が不要な場合はそっくりそのまま取り外してください。
- 入力データと出力データは、先に正解のプログラムを作っておいて、ファイル出力しています。
- 途中で”Error”とか"OK"とかprint文で出していますが、邪魔なときはコメントアウトして使ってます。
感想
- 採点が楽になりました。
- 時間があるときに今度はsubprocessで作ります → 作りました