| 1234567891011121314151617181920212223242526272829303132 |
- #!/usr/bin/env python3
- import sys
- from itertools import pairwise
- def parse(inp):
- DXDY = (1, 0), (0, 1), (-1, 0), (0, -1)
- for line in inp:
- direction, distance, color = line.split()
- normal_instruction = DXDY['RDLU'.index(direction)], int(distance)
- color_instruction = DXDY[int(color[7])], int(color[2:7], 16)
- yield normal_instruction, color_instruction
- def follow(instructions):
- x = y = 0
- for (dx, dy), distance in instructions:
- x += dx * distance
- y += dy * distance
- yield x, y
- def dig(instructions):
- x, y = zip(*follow(instructions))
- v = len(x)
- area = abs(sum(x[i] * y[(i + 1) % v] - y[i] * x[(i + 1) % v]
- for i in range(v))) // 2 # Shoelace formula
- outer = sum(abs(bx - ax + by - ay)
- for (ax, ay), (bx, by) in pairwise(zip(x + x[:1], y + y[:1])))
- inner = area - outer // 2 + 1 # Pick's theorem
- return outer + inner
- normal, color = zip(*parse(sys.stdin))
- print(dig(normal))
- print(dig(color))
|