100 lines
2.6 KiB
Python
100 lines
2.6 KiB
Python
"""Day X: Advent of Code 2025."""
|
|
|
|
import time
|
|
from collections import defaultdict
|
|
from aoc import read_lines, read_input, read_grid, read_ints
|
|
import numpy as np
|
|
from functools import lru_cache
|
|
|
|
|
|
|
|
def traverse(start_pos: tuple[int, int], data: np.ndarray, visited: set, collisions: set):
|
|
start_row, start_col = start_pos
|
|
if (start_row, start_col) in visited:
|
|
return
|
|
|
|
visited.add((start_row, start_col))
|
|
row, col = data.shape
|
|
r = start_row + 1
|
|
while True:
|
|
if r >= row:
|
|
break
|
|
v = data[r, start_col]
|
|
if (r, start_col) in collisions:
|
|
break
|
|
if v == '^':
|
|
collisions.add((r, start_col))
|
|
if start_col + 1 < col:
|
|
traverse((r, start_col + 1), data, visited, collisions)
|
|
if start_col - 1 >= 0:
|
|
traverse((r, start_col - 1), data, visited, collisions)
|
|
break
|
|
|
|
r += 1
|
|
|
|
return
|
|
|
|
def traverse_2(start_pos: tuple[int, int], data: np.ndarray, cache=None):
|
|
if cache is None:
|
|
cache = {}
|
|
if start_pos in cache:
|
|
return cache[start_pos]
|
|
|
|
start_row, start_col = start_pos
|
|
row, col = data.shape
|
|
r = start_row + 1
|
|
counter = 0
|
|
|
|
while True:
|
|
if r >= row:
|
|
cache[start_pos] = counter + 1
|
|
return counter + 1
|
|
v = data[r, start_col]
|
|
|
|
if v == '^':
|
|
if start_col + 1 < col:
|
|
counter += traverse_2((r, start_col + 1), data, cache)
|
|
if start_col - 1 >= 0:
|
|
counter += traverse_2((r, start_col - 1), data, cache)
|
|
break
|
|
|
|
r += 1
|
|
|
|
cache[start_pos] = counter
|
|
return counter
|
|
|
|
def part1(data: np.ndarray):
|
|
rows, cols = np.where(data == 'S')
|
|
if len(rows) == 0:
|
|
raise ValueError("Start 'S' not found in grid")
|
|
start_row, start_col = int(rows[0]), int(cols[0])
|
|
collision = set()
|
|
visited = set()
|
|
traverse((start_row, start_col), data, visited, collision)
|
|
print(data)
|
|
return len(collision)
|
|
|
|
|
|
def part2(data):
|
|
rows, cols = np.where(data == 'S')
|
|
if len(rows) == 0:
|
|
raise ValueError("Start 'S' not found in grid")
|
|
start_row, start_col = int(rows[0]), int(cols[0])
|
|
counter = traverse_2((start_row, start_col), data)
|
|
return counter
|
|
|
|
|
|
if __name__ == "__main__":
|
|
DAY = 7 # <- ändra till rätt dag
|
|
data = read_grid(DAY)
|
|
|
|
t0 = time.perf_counter()
|
|
p1 = part1(data)
|
|
t1 = time.perf_counter()
|
|
print(f"Part 1: {p1} ({(t1-t0)*1000:.2f} ms)")
|
|
|
|
t0 = time.perf_counter()
|
|
p2 = part2(data)
|
|
t1 = time.perf_counter()
|
|
print(f"Part 2: {p2} ({(t1-t0)*1000:.2f} ms)")
|