```python:gen.py import os import sys import random # ここは各自で変えてください # コマンドラインからpython gen.py 100などとして実行することも可能です NUM_OF_SEEDS = 100 # ここは変えても変えなくても FOLDER_NAME = 'gen' L, N, M = 1000, 1000, 100000 def main(NUM_OF_SEEDS=NUM_OF_SEEDS): if not os.path.exists(FOLDER_NAME): os.makedirs(FOLDER_NAME) for seed in range(NUM_OF_SEEDS): RPs = [] ABCDs = [] for i in range(N): ri = random.randint(1, 200) pi = random.randint(1, max(1, (ri**3)//100)) RPs.append((ri, pi)) for i in range(M): while True: ai = random.randint(1, N) bi = random.randint(1, N) if ai != bi: break if ai > bi: ai, bi = bi, ai ci = random.randint(RPs[ai-1][0]+RPs[bi-1][0]+1, RPs[ai-1][0]+RPs[bi-1][0]+200) di = random.randint(1, 2*RPs[ai-1][0]*RPs[bi-1][0]) ABCDs.append((ai, bi, ci, di)) with open(FOLDER_NAME+"\\"+f"{seed:04}.txt", mode='w') as f: f.write(f"{L} {N} {M}") f.write("\n") for (r, p) in RPs: f.write(f"{r} {p}") f.write("\n") for (a, b, c, d) in ABCDs: f.write(f"{a} {b} {c} {d}") f.write("\n") print(f"\r進行状況 {(1+seed)/NUM_OF_SEEDS:.2%}", end="") else: print("\ndone!") if __name__ == '__main__': args = sys.argv if len(args) == 1: print(f"{NUM_OF_SEEDS}個生成します") main() elif len(args) == 2: try: print(f"{int(args[1])}個生成します") main(int(args[1])) except ValueError: assert False, "引数には整数を指定してください" else: print(args) print("実行方法が異なります python gen.py 100 などとしてみて下さい") ```
テスター
スコア以外に充填率なども返します。 ```python:judge.py import sys import math # ここは各自で変えてください # コマンドラインからpython judge.py "in.txt" "out.txt"などとして実行することも可能です INPUT_PATH = 'in.txt' OUTPUT_PATH = 'out.txt' L, N, M = 1000, 1000, 100000 def main(INPUT_PATH=INPUT_PATH, OUTPUT_PATH=OUTPUT_PATH): score = 0 basis = 0 bonus = 0 cnt = 0 XYZs = [] used_spheres = set() volume = 0 try: with open(INPUT_PATH) as f: _, _, _ = map(int, f.readline().split()) RPs = [list(map(int, f.readline().split())) for _ in range(N)] ABCDs = [list(map(int, f.readline().split())) for _ in range(M)] except FileNotFoundError: assert False, f"入力ファイルのパスが見つかりません\n指定されたパス:{INPUT_PATH}" # チェック1 箱内か + 基礎点を加算 try: with open(OUTPUT_PATH) as f: for i in range(N): x, y, z = map(int, f.readline().split()) XYZs.append((x, y, z)) r = RPs[i][0] if (x, y, z) == (-1, -1, -1): continue assert 0+r <= x <= L-r, f"箱に収まっていない球が存在します(x:{x} y:{y} z:{z})" assert 0+r <= y <= L-r, f"箱に収まっていない球が存在します(x:{x} y:{y} z:{z})" assert 0+r <= z <= L-r, f"箱に収まっていない球が存在します(x:{x} y:{y} z:{z})" cnt += 1 basis += RPs[i][1] used_spheres.add(i) volume += (4/3)*math.pi*(r**3) except FileNotFoundError: assert False, f"出力ファイルのパスが見つかりません\n指定されたパス:{OUTPUT_PATH}" # チェック2 重なっていないか for i, xyz1 in enumerate(XYZs): for j, xyz2 in enumerate(XYZs): if i == j: continue if xyz1 == (-1, -1, -1): continue if xyz2 == (-1, -1, -1): continue assert math.dist(xyz1, xyz2) >= RPs[i][0] + RPs[j][0],\ "重なり合っている球が存在します\n" \ + f"球1:{xyz1} 半径{RPs[i][0]} 球2:{xyz2} 半径{RPs[i][1]}" # ボーナス点を加算 for a, b, c, d in ABCDs: if a in used_spheres and b in used_spheres: if math.dist(XYZs[a], XYZs[b]) <= c: bonus += d score = basis+bonus print("ok! this output meets the requirements!") print(f"score: {score:,}") print(f"(basis: {basis:,} bonus: {bonus:,})") print(f"filling rate: {volume/L**3:%}") print(f"number of used spheres: {cnt}/{N}") if __name__ == '__main__': args = sys.argv if len(args) == 1: print("注意 デフォルトのパスが使用されます") main() elif len(args) == 3: main(args[1], args[2]) else: print(args) print("実行方法が異なります python judge.py \"in.txt\" \"out.txt\"としてみて下さい") ```