| @@ -0,0 +1,48 @@ | |||
| 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() | |||