summaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2022-12-23 08:30:22 +0100
committernekineki <nekineki@nekineki.net>2022-12-23 08:30:22 +0100
commit8e2fb68df01c1d6145602c52f88632a8e19bb813 (patch)
tree0e4bfff7d6740502e70c6090f6af66c970b332d1 /2022
parentcd9dc585feb478b5d5d7b240ca3ed37da7b57a97 (diff)
day23
Diffstat (limited to '2022')
-rwxr-xr-x2022/day23.py85
1 files changed, 25 insertions, 60 deletions
diff --git a/2022/day23.py b/2022/day23.py
index 27287ba..acf4d8a 100755
--- a/2022/day23.py
+++ b/2022/day23.py
@@ -12,11 +12,15 @@ import sys
filename = "in/day23.pzl"
data = open(filename).read()
lines = [line for line in data.rstrip('\n').split('\n')]
-print(lines)
+# print(lines)
-res1 = 0
-res2 = 0
+E = set()
+for y,line in enumerate(lines):
+ for x,val in enumerate(line):
+ if val == '#':
+ E.add((y,x))
+# print(E)
def check_N(E, y, x):
if all( [(y+dy, x+dx) not in E for dy,dx in [[-1,0], [-1,1], [-1,-1]]] ):
@@ -42,15 +46,7 @@ def check_E(E, y, x):
else:
return None
-E = set()
-N = list()
-for y,line in enumerate(lines):
- for x,val in enumerate(line):
- if val == '#':
- E.add((y,x))
- N.append( (y,x, [check_N, check_S, check_W, check_E]) )
-# print(E)
-# print(N)
+C = [check_N, check_S, check_W, check_E]
def get_max(E):
min_y = 1000
@@ -79,8 +75,6 @@ def print_elfs(E):
print()
-
-
def get_new_pos(E, y, x, checks):
checks = checks[:]
@@ -90,51 +84,28 @@ def get_new_pos(E, y, x, checks):
move = True
break
if move == False:
- checks.append(checks.pop(0))
- return y, x, checks
+ return y, x
for i,check in enumerate(checks):
ret = check(E,y,x)
if ret != None:
y, x = ret
break
- else:
- checks.append(checks.pop(0))
- return y,x, checks
-
- # print('changing order', y, x, i, checks)
- # checks.append(checks.pop(i))
- checks.append(checks.pop(0))
- return y,x, checks
+ return y,x
+# print_elfs(E)
-print_elfs(E)
-
-
-for round_n in range(1,1000+1):
-# for round_n in range(1,10+1):
- print(round_n)
+for round_n in range(1,10000+1):
+ # print(round_n)
Ec = E.copy()
dest = defaultdict(list)
for y,x in E:
-
- for i, (yy,xx,_) in enumerate(N):
- if yy == y and xx == x:
- break
- else:
- assert False
-
- checks = N[i][2]
- ny,nx,checks = get_new_pos(E,y,x,checks)
-
+ ny,nx = get_new_pos(E,y,x,C)
dest[(ny,nx)].append((y,x))
- N[i] = (y,x, checks)
-
-
- # print(dest)
+ C.append(C.pop(0))
for ey,ex in dest:
if len(dest[(ey,ex)]) > 1:
@@ -144,27 +115,21 @@ for round_n in range(1,1000+1):
E.remove((sy,sx))
E.add((ey,ex))
- for i, (yy,xx,checks) in enumerate(N):
- if yy == sy and xx == sx:
- break
- else:
- assert False
- N[i] = (ey,ex,checks)
+ # print_elfs(E)
+
+ if round_n == 10:
+ res1 = 0
+ min_y, max_y, min_x, max_x = get_max(E)
+ for y in range(min_y, max_y+1):
+ for x in range(min_x, max_x+1):
+ if (y,x) not in E:
+ res1 += 1
- # print(E)
- # print(N)
- print_elfs(E)
if E == Ec:
+ res2 = round_n
break
-res1 = 0
-min_y, max_y, min_x, max_x = get_max(E)
-for y in range(min_y, max_y+1):
- for x in range(min_x, max_x+1):
- if (y,x) not in E:
- res1 += 1
-
print('res1:', res1)
print('res2:', res2)