Skip to content

对拍

对拍器

支持对拍py/exe,支持单数据判断/多程序对拍

py
import subprocess
import sys

def execute_program(input_file, program, provide_input=True):
    try:
        if program.endswith(".exe"):
            if provide_input:
                output = subprocess.check_output([program], stdin=open(input_file), text=True)
            else:
                output = subprocess.check_output([program], text=True)
        elif program.endswith(".py"):
            if provide_input:
                output = subprocess.check_output(['python', program], stdin=open(input_file), text=True)
            else:
                output = subprocess.check_output(['python', program], text=True)
        else:
            raise ValueError("Unsupported program type. Only .exe and .py are supported.")
        
        return output.strip().split('\n')
    
    except subprocess.CalledProcessError as e:
        print(f"Error running {program}: {e}")
        return []

def compare_outputs(output1, output2):
    if len(output1) != len(output2):
        return False
    return all(line1 == line2 for line1, line2 in zip(output1, output2))

def redirect_stdout_to_file(func):
    def wrapper():
        global RESULT_FILE_NAME
        with open(RESULT_FILE_NAME, 'w') as output_file:
            sys.stdout = output_file
            func()
            sys.stdout = sys.__stdout__
    return wrapper

def run_single_test(input_file, program1, program2):
    program1_output = execute_program(input_file, program1)
    program2_output = execute_program(input_file, program2)

    if compare_outputs(program1_output, program2_output):
        print("AC, Continue..")
        return True
    else:
        print("WA")
        print(f"{program1} output:\n{program1_output}")
        print(f"{program2} output:\n{program2_output}")
        return False

@redirect_stdout_to_file
def test_case_single():
    global TESTCASE_FILE, PROGRAM_1, PROGRAM_2
    print(f"Test File {TESTCASE_FILE}",end=" ")
    run_single_test(TESTCASE_FILE, PROGRAM_1, PROGRAM_2)

@redirect_stdout_to_file
def test_case_auto_generated():
    global DATA_GENERATOR, MAX_TESTS, PROGRAM_1, PROGRAM_2, DATA_GENERATOR_OUTPUT
    for i in range(MAX_TESTS):
        with open(DATA_GENERATOR_OUTPUT,"w") as f:
            for li in execute_program(None, DATA_GENERATOR, provide_input=False):
                f.write(f"{li}\n")
        print(f"Test case # {i+1}",end=" ")
        ans=run_single_test(DATA_GENERATOR_OUTPUT, PROGRAM_1, PROGRAM_2)
        if not ans:
            break

if __name__ == "__main__":

    RESULT_FILE_NAME = "result_output.txt"

    # 单个测试用例
    TESTCASE_FILE = 'output_auto.txt'
    

    # 自动生成测试用例并测试
    DATA_GENERATOR = "data_generator.py"
    DATA_GENERATOR_OUTPUT="output_auto.txt"
    MAX_TESTS = 10000

    PROGRAM_1 = "test/a.exe"
    PROGRAM_2 = "test/sample.exe"
    
    # test_case_single()
    test_case_auto_generated()

数据生成器

py
import random
import time


random.seed(int(time.time()))

f=["A","C","T","G","*","?"]

s=""
for i in range(random.randint(1, 5)):
    s+=random.choice(f)

print(s)

f=f[:-2]
m=random.randint(1, 5)
print(m)
for _ in range(m):
    n=random.randint(1, 10)
    s=""
    for _ in range(n):
        s+=random.choice(f)
    print(s)

网站基于vitepress主题open17💙