diff options
| author | nekineki <nekineki@nekineki.net> | 2022-12-23 08:30:22 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2022-12-23 08:30:22 +0100 |
| commit | 8e2fb68df01c1d6145602c52f88632a8e19bb813 (patch) | |
| tree | 0e4bfff7d6740502e70c6090f6af66c970b332d1 /2022 | |
| parent | cd9dc585feb478b5d5d7b240ca3ed37da7b57a97 (diff) | |
day23
Diffstat (limited to '2022')
| -rwxr-xr-x | 2022/day23.py | 85 |
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) |
