summaryrefslogtreecommitdiff
path: root/2022/day24.py
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2022-12-24 07:04:33 +0100
committernekineki <nekineki@nekineki.net>2022-12-24 07:04:33 +0100
commit1addc1ee10820384de416d30a0b9be595f7dc648 (patch)
treea5f4bdd5eaa99148d9ce032b1b4b4918c2845a0c /2022/day24.py
parent8e2fb68df01c1d6145602c52f88632a8e19bb813 (diff)
day24
Diffstat (limited to '2022/day24.py')
-rwxr-xr-x2022/day24.py125
1 files changed, 125 insertions, 0 deletions
diff --git a/2022/day24.py b/2022/day24.py
new file mode 100755
index 0000000..ac72b58
--- /dev/null
+++ b/2022/day24.py
@@ -0,0 +1,125 @@
+#!/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)
+