#!/usr/bin/env python3 # import numpy as np from functools import reduce from re import findall from copy import deepcopy from collections import defaultdict import sys # filename = "in/day24.ref" filename = "in/day24.pzl" data = open(filename).read() lines = [line for line in data.rstrip('\n').split('\n')] # print(lines) D = dict() for y,line in enumerate(lines): for x,val in enumerate(line): if val != '.': D[(y,x)] = val def get_max(D): min_y = 1000 max_y = 0 min_x = 1000 max_x = 0 for y,x in D: min_y = min(min_y, y) max_y = max(max_y, y) min_x = min(min_x, x) max_x = max(max_x, x) return min_y, max_y, min_x, max_x def print_grid(D, P): min_y, max_y, min_x, max_x = get_max(D) for y in range(min_y, max_y + 1): for x in range(min_x, max_x + 1): if (y,x) in P: print('E',end='') elif (y,x) in D: print(D[(y,x)][0],end='') else: print('.', end='') print() print() print() min_y, max_y, min_x, max_x = get_max(D) start_x = 1 end_x = max_x - 1 def get_next_D(D): Dn = defaultdict(list) for (y,x) in D: for val in D[(y,x)]: if val == '#': Dn[(y,x)].append('#') elif val == '>': nx = x + 1 if nx == max_x: nx = 1 Dn[(y,nx)].append('>') elif val == '<': nx = x - 1 if nx == 0: nx = max_x - 1 Dn[(y,nx)].append('<') elif val == 'v': ny = y + 1 if ny == max_y: ny = 1 Dn[(ny,x)].append('v') elif val == '^': ny = y - 1 if ny == 0: ny = max_y - 1 Dn[(ny,x)].append('^') return Dn def dfs(Dstart, Pstart, Pend): P = Pstart D = Dstart it = 0 for _ in range(1000): it += 1 Pn = set() D = get_next_D(D) for y,x in P: for dy,dx in [0,0], [1,0], [-1,0], [0,1], [0,-1]: if 0 <= y+dy <= max_y and 0 <= x+dx <= max_x: if (y+dy, x+dx) not in D: Pn.add((y+dy,x+dx)) P = Pn # print_grid(D, P) # print(P) for (y,x) in P: if (y,x) in Pend: return D, it Pstart = set() Pstart.add((0,1)) Pend = set() Pend.add((max_y, max_x-1)) D, t1 = dfs(D, Pstart, Pend) D, t2 = dfs(D, Pend, Pstart) D, t3 = dfs(D, Pstart, Pend) res1 = t1 res2 = t1 + t2 + t3 print('res1:', res1) print('res2:', res2)