import re import sys import os # 输入、输出文件后缀。可更改 insuf, outsuf = "in", "out" print ("problem.conf 自助配置") path = 'data' spjp, stdp, valp, subtaskp = False, False, False, False def continuep (): pass for s in os.listdir ("."): if s == 'problem.conf': print ("警告:problem.conf 已存在,将会被覆盖") continuep () if s == 'chk.cpp': spjp = True if s == 'std.cpp': stdp = True if s == 'val.cpp': valp = True if os.path.isdir (s) and re.match ("subtask[0-9]*", s): subtaskp = True output = open ("problem.conf", "w") chker = None if spjp: print ("识别到 chk.cpp,已启用 Special Judge") else: # chker = input ("未识别到 chk.cpp,请输入自定义校验器类型:") chker = 'wcmp' print ("use_builtin_judger on", file=output) if chker: print ("use_builtin_checker %s" % chker, file=output) if subtaskp: print ("识别到 subtaskX 目录,自动识别 Subtask 中") else: print ("未识别到 subtaskX 目录,自动尝试普通配置(如果你认为 Subtask 存在,但文件名格式为 subXX_XX.in/out,尝试使用 subxx2datax.py 脚本)") tlim = int (sys.argv[1]) mlim = int (sys.argv[2]) print ("time_limit %d\nmemory_limit %d" % (tlim, mlim), file=output) patt = re.compile ("([A-Z]*[a-z]*[A-Z]*)([0-9]+).(%s|%s)" % (insuf, outsuf)) def processdir (path): tcases = 0 pre = None for s in os.listdir (path): if os.path.isdir (s): continue q = re.findall (patt, s) if len (q) != 1: continue print ("识别到数据文件 %s" % s) q = q[0] if not pre: pre = q[0] elif pre != q[0]: raise Exception ("数据文件前缀不相同!同时找到了 %s 与 %s,自动配置失败。" % (pre, q[0])) if int (q[1]) > tcases: tcases = int (q[1]) if tcases == 0 or not pre: raise Exception ("无法自动识别数据文件") return (tcases, pre) if not subtaskp: tcases, pre = processdir (".") print ("找到 %d 个测试点" % tcases) print ("n_tests %d" % tcases, file=output) print ("n_ex_tests 0\nn_sample_tests 0", file=output) print ("input_pre %s\ninput_suf %s" % (pre, insuf), file=output) print ("output_pre %s\noutput_suf %s" % (pre, outsuf), file=output) print ("自动配置结束!") else: tcases, subs = 0, 0 pre = None subtptt = re.compile ("subtask([0-9]*)") end = { } for s in os.listdir ("."): if os.path.isdir (s): q = re.findall (subtptt, s) if len (q) != 1: print ("忽略非 Subtask 目录 %s" % s) continue print ("找到 subtask 目录 %s" % s) subs += 1 nc, spre = processdir (s) if not pre: pre = spre elif pre != spre: raise Exception ("Subtask 间文件前缀不同!同时找到了 %s 与 %s,自动配置失败。" % (pre, spre)) end[int (q[0])] = nc if nc > tcases: tcases = nc print ("n_tests %d\nn_ex_tests 0\nn_sample_tests 0" % tcases, file=output) print ("input_pre %s\ninput_suf %s" % (pre, insuf), file=output) print ("output_pre %s\noutput_suf %s" % (pre, outsuf), file=output) print ("找到 %d 个 Subtask,共 %d 个测试点" % (subs, tcases)) scs = 100.0 / subs print ("正在按照每个 Subtask 等分配置(%.2f 分)" % scs) print ("n_subtasks %d" % subs, file=output) for i in range (1, subs + 1): print ("subtask_end_%d %d" % (i, end[i]), file=output) print ("subtask_score_%d %.2f" % (i, scs), file=output) output.close ()