勉強の記録

機械学習、情報処理について勉強した事柄など

Google CodeJamをVSC上でデバッグする

Qualification RoundはAtCoderのコードテストを間借りしてコーディングしたのだけど、やっぱりVisual Studio Codeを使いたい。

input()だけ書き換えて、printと想定解を目でみて比較すればよいのだけど、 'Case' → 'CASE' ': ' → ':' あたりでWAになったことがあるので、できればサンプルケースはコピペして実行したい。

ついでに、input()もコピペを間違えると怖いので、提出へもそのままコピペしたい。

ということで、真ん中にそのままコピペできるコード部を残して前後に挟むスクリプトを作った。

stdoutをredirectする方法は見つかったのだけど、自身のstdinに流し込む方法はなさそうなので、inputメソッドをgeneraterで書き換えている。sys.stdin()などinput()以外には対応していない。redirect_stdoutはwith文で使うことが多いようだが、インデントが残ってしまうのでenter()とexit()を使っている。#mainのセクションのみコピペすると幸せになれる、はず!

###########
# header #
###########
from contextlib import redirect_stdout
from io import StringIO
from difflib import Differ
from itertools import zip_longest as _zip_longest

with open('input.txt', 'r') as f:
    _input = f.read()

def input_generator(_input):
    for line in _input.splitlines():
        yield line

input_gen=input_generator(_input)
input = input_gen.__next__

captured_stdout = StringIO()
_redirect_stdout = redirect_stdout(captured_stdout)
_redirect_stdout.__enter__()

########
# main #
########

def solve(a,b):
    print(a+b)
    print(a)
    

T=int(input())
for _ in range(T):
    a=int(input())
    b=int(input())
    
    solve(a,b)


##########
# footer  #
##########
_redirect_stdout.__exit__(None, None, None)

with open('output.txt', 'r') as f:
    out = f.read()

for x,y in _zip_longest(captured_stdout.getvalue().splitlines(),
                out.splitlines()):
    print('\n'.join(Differ().compare([x],[y])))

使っているところはこんな感じ。input, outputともひとまずサンプルケースのコピペで良いし、必要があれば適宜自作のテストケースを書き加える。 f:id:tmitani-tky:20190409000358p:plain