import re def parse(file): robots = [] for line in file: match = re.findall(r'-?\d+', line) px,py, vx,vy = [int(x) for x in match] robots.append(((px,py),(vx,vy))) return robots def solve(file, W, H): robots = parse(file) print(robots) robots = [iterate(r, 100, W, H) for r in robots] print(robots) mx = W//2 my = H//2 quads = {1:[], 2:[], 3:[], 4:[]} print(mx,my) for (x,y),_ in robots: q = 0 if x < mx and y < my: q = 1 if x > mx and y < my: q = 2 if x < mx and y > my: q = 3 if x > mx and y > my: q = 4 if q > 0: quads[q].append((x,y)) print(quads) total = 1 for v in quads.values(): total *= len(v) print(total) def solve2(file, W, H): robots = parse(file) mq = float('inf') for t in range(0, W*H): rs = lambda: (iterate(r, t, W, H) for r in robots) q = quads(rs(), W, H) qs = q[0]*q[1]*q[2]*q[3] if mq > qs: mq = qs if qs == mq: picture = [["."]*W for _ in range(H)] for (x,y),_ in rs(): if y < H: picture[y][x] = "#" for line in picture: print("".join(line)) print("t = ", t, "q = ", qs) #input(">") # 442? # 493 def quads(robots, W, H): mx = W//2 my = H//2 q1, q2, q3, q4 = 0, 0, 0, 0 #seen = set() for (x,y),_ in robots: #if (x,y) in seen: # continue #seen.add((x,y)) if x < mx and y < my: q1 += 1 if x > mx and y < my: q2 += 1 if x < mx and y > my: q3 += 1 if x > mx and y > my: q4 += 1 return [q1, q2, q3, q4] def iterate(robot, t, W, H): (px,py), (vx,vy) = robot px = (px+vx*t)%W py = (py+vy*t)%H return (px,py), (vx,vy) #solve(open("sample1.in"), 11, 7) #solve(open("input"), 101, 103) solve2(open("input"), 101, 103)