def build_grid(text): grid = {} for ln in text.splitlines(): ns = map(int, ''.join(n if n.isdigit() else ' ' for n in ln).split()) nodes = [complex(x, y) for x, y in zip(*[ns] * 2)] for aa, bb in zip(nodes, nodes[1:]): step = (bb - aa) / abs(bb - aa) while aa != bb: grid[aa] = '#' aa += step grid[aa] = '#' return grid def drip(grid, start, floor, p1=False, dof=[1j, 1j - 1, 1j + 1]): pos = start while True: for new in (pos + step for step in dof): if new not in grid and new.imag != floor: pos = new break else: grid[pos] = 'o' yield True pos = start if p1: if pos.imag == floor - 1: break else: if grid.get(start) == 'o': break def main(): text = open(0).read() grid = build_grid(text) start = complex(500, 0) floor = max(p.imag for p in grid) + 2 ans1 = sum(drip(grid.copy(), start, floor, True)) print(ans1) ans2 = sum(drip(grid.copy(), start, floor)) print(ans2) main()