Commit c79e7660 authored by Kento HASEGAWA's avatar Kento HASEGAWA
Browse files

Add a script for ADC2019 system

parent bfa4d5ec
Loading
Loading
Loading
Loading

iskw_solver.py

0 → 100644
+108 −0
Changes for iskw_solver.py: 108 added lines, 0 removed lines.
Original line number Diff line number Diff line
import argparse
import os
import subprocess

proc = None
stop_flag = False

def stop():
    global proc
    global stop_flag

    stop_flag = True
    if not proc is None:
        proc.terminate()
        print('stopped')

def solve(params):
    global proc
    global stop_flag

    stop_flag = False

    # 必要な変数があるか確認
    assert('problem' in params)

    problem = params['problem']

    pl = problem.splitlines()
    for l in pl:
        if "SIZE" in l:
            board_size_str = l.strip().split()[1]
            bx, by = [int(v) for v in board_size_str.split('X')]
            break

    basedir = os.path.abspath(os.path.dirname(__file__))

    cmds = f'{basedir}/main'.split()

    proc = subprocess.Popen(
        cmds,
        stdin=subprocess.PIPE,
        stderr=subprocess.PIPE,
        stdout=subprocess.PIPE
    )

    try:
        outs, errs = proc.communicate(problem.encode())
        status = 'done'
    except Exception as ex:
        status = 'failed'
    finally:
        returncode = proc.returncode
        outs = outs.decode()
        errs = errs.decode()
        print(outs)
        print(errs)

    solution = ''
    if returncode == 0:    # 10 when SAT
        status = 'done'

        lines = outs.splitlines()
        state = 0
        for l in lines:

            if "SIZE" in l:
                board_size_str = l.strip().split()[1]
                sx, sy = [int(v) for v in board_size_str.split('X')]
                if sx > by or sy > by:
                    status = 'failed'
                    break
            elif 'ANSWER' in l:
                state = 1
                continue
            elif state == 1:
                if l.strip() == '':
                    break
                else:
                    solution += l + '\n'
    else:
        status = 'failed'

    return {
        'status': status,
        'solution': solution
    }

def main(args):

    with open(args['problem'], 'r') as fp:
        problem = fp.read()
    
    params = {
        'problem': problem,
    }

    ret = solve(params)

    print(ret)

if __name__ == "__main__":
    
    parser = argparse.ArgumentParser(description='Wrapper Script for ADC2019 Solver')
    parser.add_argument('problem', type=str, help='File path to the problem file')
    parser.add_argument('-t', '--timeout', type=int, default=10, help='Timeout for the process of the solver')
    args = vars(parser.parse_args())

    main(args)