LoginSignup
0
1

More than 1 year has passed since last update.

AtCoderの検証用プログラムをPythonで自作した(雑)

Last updated at Posted at 2022-12-18

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で作ります → 作りました
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1