My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add solution for 2024/06

+59
+59
2024/day06.py
··· 1 + import fileinput 2 + from utils import Point, N, S, E, W 3 + 4 + 5 + DIRS = [S, E, N, W] 6 + 7 + def simulate(board, start, obs=None): 8 + BOARD[obs] = '#' 9 + p = start 10 + d = 0 11 + seen = set() 12 + 13 + while True: 14 + if (p, d) in seen: 15 + # Loop detected. 16 + BOARD[obs] = '.' 17 + return None 18 + 19 + seen.add((p, d)) 20 + 21 + np = p + DIRS[d] 22 + if BOARD.get(np) == '#': 23 + d = (d + 1) % 4 24 + elif BOARD.get(np) is None: 25 + break 26 + else: 27 + p += DIRS[d] 28 + 29 + BOARD[obs] = '.' 30 + return set(p for p, _ in seen) 31 + 32 + # Read problem input. 33 + BOARD = {} 34 + for y, line in enumerate(fileinput.input()): 35 + for x, c in enumerate(line.strip()): 36 + p = Point(x, y) 37 + BOARD[p] = c 38 + if c == '^': 39 + START = p 40 + 41 + # Solve part 1. 42 + seen = simulate(BOARD, START) 43 + print("Part 1:", len(seen)) 44 + 45 + # Solve part 2. 46 + candidates = set() 47 + for x in seen: 48 + for n in x.neighbours(): 49 + candidates.add(n) 50 + 51 + part_2 = 0 52 + for p in candidates: 53 + if p not in seen or BOARD.get(p) != '.': 54 + continue 55 + if simulate(BOARD, START, obs=p) is None: 56 + part_2 += 1 57 + 58 + print("Part 2:", part_2) 59 +