import re
import os
# 输入、输出文件后缀。可更改
insuf, outsuf = "in", "out"
print ("problem.conf 自助配置")
path = input ("输入数据目录:")
os.chdir (path)
spjp, stdp, valp, subtaskp = False, False, False, False
def continuep ():
s = input ("要继续吗?(y/N)")
if s != "y":
exit (1)
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,请输入自定义校验器类型:")
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 (input ("时间限制(秒):"))
mlim = int (input ("空间限制(MB):"))
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 ()
自动 problem.conf 配置脚本!非常好用!!!
2025-04-23 09:20:55 By ryp
评论
ryp
@__vector__ @Pigsyy 测试 at
- 2025-04-25 22:46:57
发表评论
可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。