123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- lines = [(line[0], int(line[2:])) for line in open("9.input")]
- DIR = {'R': (0, 1), 'L': (0, -1), 'U': (-1, 0), 'D': (1, 0)}
- #SNEK_LEN = 2 # Part 1
- SNEK_LEN = 10 # Part 2
- snek = [(0, 0) for _ in range(0, SNEK_LEN)]
- def add(a, b):
- return (a[0] + b[0], a[1] + b[1])
- def show_snek(snek):
- for x in range(-20, 20):
- for y in range(-20, 20):
- if (x, y) in snek:
- print("#", end='')
- elif (x, y) == (0, 0):
- print("s", end='')
- else:
- print(".", end='')
- print("")
- visited = set()
- visited.add(snek[-1])
- for direction, steps in lines:
- for _ in range(0, steps):
- # Move head
- snek[0] = add(snek[0], DIR[direction])
- # Follow with tail
- for head_idx in range(0, len(snek) - 1):
- head = snek[head_idx]
- tail = snek[head_idx+1]
- follow = [0, 0]
- follow[0] = head[0] - tail[0]
- follow[1] = head[1] - tail[1]
- dist = sum(map(abs, follow))
- if dist >= 3:
- follow[0] = follow[0] // abs(follow[0])
- follow[1] = follow[1] // abs(follow[1])
- elif abs(follow[0]) == 2:
- follow[0] = follow[0] // 2
- elif abs(follow[1]) == 2:
- follow[1] = follow[1] // 2
- else:
- follow = [0, 0]
- snek[head_idx+1] = add(snek[head_idx+1], follow)
- visited.add(snek[-1])
- print(len(visited))
|