autoconf.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import re
  2. import sys
  3. import os
  4. # 输入、输出文件后缀。可更改
  5. insuf, outsuf = "in", "out"
  6. print ("problem.conf 自助配置")
  7. path = 'data'
  8. spjp, stdp, valp, subtaskp = False, False, False, False
  9. def continuep ():
  10. pass
  11. for s in os.listdir ("."):
  12. if s == 'problem.conf':
  13. print ("警告:problem.conf 已存在,将会被覆盖")
  14. continuep ()
  15. if s == 'chk.cpp':
  16. spjp = True
  17. if s == 'std.cpp':
  18. stdp = True
  19. if s == 'val.cpp':
  20. valp = True
  21. if os.path.isdir (s) and re.match ("subtask[0-9]*", s):
  22. subtaskp = True
  23. output = open ("problem.conf", "w")
  24. chker = None
  25. if spjp:
  26. print ("识别到 chk.cpp,已启用 Special Judge")
  27. else:
  28. # chker = input ("未识别到 chk.cpp,请输入自定义校验器类型:")
  29. chker = 'wcmp'
  30. print ("use_builtin_judger on", file=output)
  31. if chker:
  32. print ("use_builtin_checker %s" % chker, file=output)
  33. if subtaskp:
  34. print ("识别到 subtaskX 目录,自动识别 Subtask 中")
  35. else:
  36. print ("未识别到 subtaskX 目录,自动尝试普通配置(如果你认为 Subtask 存在,但文件名格式为 subXX_XX.in/out,尝试使用 subxx2datax.py 脚本)")
  37. tlim = int (sys.argv[1])
  38. mlim = int (sys.argv[2])
  39. print ("time_limit %d\nmemory_limit %d" % (tlim, mlim), file=output)
  40. patt = re.compile ("([A-Z]*[a-z]*[A-Z]*)([0-9]+).(%s|%s)" % (insuf, outsuf))
  41. def processdir (path):
  42. tcases = 0
  43. pre = None
  44. for s in os.listdir (path):
  45. if os.path.isdir (s):
  46. continue
  47. q = re.findall (patt, s)
  48. if len (q) != 1:
  49. continue
  50. print ("识别到数据文件 %s" % s)
  51. q = q[0]
  52. if not pre:
  53. pre = q[0]
  54. elif pre != q[0]:
  55. raise Exception ("数据文件前缀不相同!同时找到了 %s 与 %s,自动配置失败。" % (pre, q[0]))
  56. if int (q[1]) > tcases:
  57. tcases = int (q[1])
  58. if tcases == 0 or not pre:
  59. raise Exception ("无法自动识别数据文件")
  60. return (tcases, pre)
  61. if not subtaskp:
  62. tcases, pre = processdir (".")
  63. print ("找到 %d 个测试点" % tcases)
  64. print ("n_tests %d" % tcases, file=output)
  65. print ("n_ex_tests 0\nn_sample_tests 0", file=output)
  66. print ("input_pre %s\ninput_suf %s" % (pre, insuf), file=output)
  67. print ("output_pre %s\noutput_suf %s" % (pre, outsuf), file=output)
  68. print ("自动配置结束!")
  69. else:
  70. tcases, subs = 0, 0
  71. pre = None
  72. subtptt = re.compile ("subtask([0-9]*)")
  73. end = { }
  74. for s in os.listdir ("."):
  75. if os.path.isdir (s):
  76. q = re.findall (subtptt, s)
  77. if len (q) != 1:
  78. print ("忽略非 Subtask 目录 %s" % s)
  79. continue
  80. print ("找到 subtask 目录 %s" % s)
  81. subs += 1
  82. nc, spre = processdir (s)
  83. if not pre:
  84. pre = spre
  85. elif pre != spre:
  86. raise Exception ("Subtask 间文件前缀不同!同时找到了 %s 与 %s,自动配置失败。" % (pre, spre))
  87. end[int (q[0])] = nc
  88. if nc > tcases:
  89. tcases = nc
  90. print ("n_tests %d\nn_ex_tests 0\nn_sample_tests 0" % tcases, file=output)
  91. print ("input_pre %s\ninput_suf %s" % (pre, insuf), file=output)
  92. print ("output_pre %s\noutput_suf %s" % (pre, outsuf), file=output)
  93. print ("找到 %d 个 Subtask,共 %d 个测试点" % (subs, tcases))
  94. scs = 100.0 / subs
  95. print ("正在按照每个 Subtask 等分配置(%.2f 分)" % scs)
  96. print ("n_subtasks %d" % subs, file=output)
  97. for i in range (1, subs + 1):
  98. print ("subtask_end_%d %d" % (i, end[i]), file=output)
  99. print ("subtask_score_%d %.2f" % (i, scs), file=output)
  100. output.close ()