#!/usr/bin/env python3
# usage: checker.py <input> <expected> <user_out>
# rule: Accepted if abs(a-b) <= 1e-4  OR  abs(a-b)/max(1, |expected|) <= 1e-4

import sys, math, re

TOL = 1e-4

def read_tokens(path):
    with open(path, 'r', encoding='utf-8', errors='ignore') as f:
        s = f.read()
    # 공백(개행 포함) 기준 토큰화
    return [t for t in re.split(r'\s+', s.strip()) if t != '']

def to_float(tok):
    try:
        # 과학적 표기 포함
        v = float(tok)
        if math.isnan(v):  # NaN은 무조건 오답 처리
            return None
        return v
    except:
        return None

def is_close(exp, got):
    if exp == got:
        return True
    diff = abs(exp - got)
    if diff <= TOL:
        return True
    rel = diff / max(1.0, abs(exp))
    return rel <= TOL

def main():
    if len(sys.argv) != 4:
        print("usage: checker.py <in> <exp> <out>", file=sys.stderr)
        sys.exit(3)  # 체커 오류

    _, in_path, exp_path, out_path = sys.argv
    exp = read_tokens(exp_path)
    out = read_tokens(out_path)

    if len(exp) != len(out):
        print(f"length-mismatch exp={len(exp)} out={len(out)}")
        sys.exit(1)  # WA

    for i, (e_tok, g_tok) in enumerate(zip(exp, out), 1):
        e = to_float(e_tok)
        g = to_float(g_tok)
        if e is None or g is None:
            # 숫자가 아니면 문자열로 정확히 같아야 함
            if e_tok != g_tok:
                print(f"token#{i} mismatch: '{e_tok}' vs '{g_tok}'")
                sys.exit(1)  # WA
        else:
            if not is_close(e, g):
                print(f"token#{i} diff too large: exp={e} got={g}")
                sys.exit(1)  # WA

    # 모두 통과
    print("OK")
    sys.exit(0)  # AC

if __name__ == "__main__":
    main()
