🐙

AtCoderで使うランダムテストケース用のスタンドアロンなスクリプト書いた

2022/08/20に公開

ランダムな値のテストケースを作りたい!

AtCoderで「うわああ、Wrong Answerになったあああ」というときに、テストケースを書くのがとても大変だったりすることがあると思います。

そういうときに便利なランダムテストケースを生成するやつを作りました。

ただのスクリプトなので、python3の書き方で書きます。

下の例で言うと、

  • in_5.txtから in_60.txtまでのファイルを作り、
  • ./to_test.pyに渡して、 (to_test.py は、計算量があまりよくないコードなどを使う想定です)
  • out_5.txtから out_60.txtまでを生成します。
  • あとはよしなにテストすると良さげです
random_test.py
#!/usr/bin/env python3
import sys
import os
import random

##############################################################################

# config
IN_TXT_START = 5
IN_TXT_END = 60
EXECUTION_COMMAND = './to_test.py'

input_template = '''
{X} {A} {D} {N}
'''

def create_context():
    ctx = dict()
    ctx['X'] = random.randint(-10 ** 3, 10 ** 3)
    ctx['A'] = random.randint(-10 ** 3, 10 ** 3)
    ctx['D'] = random.randint(-10 ** 3, 10 ** 3)
    ctx['N'] = random.randint(-10 ** 3, 10 ** 3)
    return ctx

##############################################################################

def generate_test():
    for i in range(IN_TXT_START, IN_TXT_END + 1):
        ctx = create_context()
        input_string = input_template.format(**ctx).strip() + '\n'

        in_file = f'in_{i}.txt'
        out_file = f'out_{i}.txt'
        print('.', end='', flush=True)
        with open(in_file, 'w') as f:
            f.write(input_string)
        os.system(f'cat {in_file} | {EXECUTION_COMMAND} > {out_file}')
    print()

# usage:
# $ python3 random_test.py

generate_test()

1つのファイルにしているのは、急遽カスタマイズしたいこととかあるんじゃないかというのを考えた結果によるものです。

↓こんな感じで出力されてうれしいです

$ python3 random_test.py
........................................................
$ cat in_60.txt
164 -719 74 -683
$ cat out_60.txt
883

Discussion