From 6fe70f851f1dd673bfe28e06da59a8d1af0192cf Mon Sep 17 00:00:00 2001 From: setop Date: Sat, 16 Dec 2023 01:56:25 +0100 Subject: [PATCH] day 14, use rotation, proper cycle detection, merge both parts, enable codon --- d14/part1.py | 30 -------------------------- d14/part2.py | 59 ---------------------------------------------------- d14/run.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 89 deletions(-) delete mode 100644 d14/part1.py delete mode 100644 d14/part2.py create mode 100644 d14/run.py diff --git a/d14/part1.py b/d14/part1.py deleted file mode 100644 index 91b81a2..0000000 --- a/d14/part1.py +++ /dev/null @@ -1,30 +0,0 @@ -import sys - -# load ptf flat -G = [list(l) for l in sys.stdin.read().splitlines()] -W = len(G[0]) -H = len(G) -print(W,H) - -# move far north each com -for x in range(W): - for y in range(H): - print(f'{x=},{y=} = {G[y][x]}') - if G[y][x] == "O": - for j in range(y-1,0-1,-1): - print(f'{j=}') - if G[j][x] == '.': # can go north - print(f'north, {j=}') - G[j][x] = "O" - G[j+1][x] = "." - else: - break - -S = 0 -for y,row in enumerate(G): - print(''.join(row)) - S += (H-y)*row.count('O') -print(S) - -# compute - diff --git a/d14/part2.py b/d14/part2.py deleted file mode 100644 index e14efad..0000000 --- a/d14/part2.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys - -I = sys.stdin.read().splitlines() -G = [list(l) for l in I] -W = len(G[0]) -H = len(G) - -def north(): - for x in range(W): - for y in range(H): - if G[y][x] == "O": - for j in range(y-1,0-1,-1): - if G[j][x] == '.': - G[j][x] = "O" - G[j+1][x] = "." - else: - break - -def south(): - for x in range(W): - for y in range(H-1,0-1,-1): - if G[y][x] == "O": - for j in range(y+1,W,1): - if G[j][x] == '.': - G[j][x] = "O" - G[j-1][x] = "." - else: - break - -def east(): - for y in range(H): - for x in range(W-1,0-1,-1): - if G[y][x] == "O": - for i in range(x+1,H,1): - if G[y][i] == '.': - G[y][i] = "O" - G[y][i-1] = "." - else: - break - - -def west(): - for y in range(H): - for x in range(W): - if G[y][x] == "O": - for i in range(x-1,0-1,-1): - if G[y][i] == '.': - G[y][i] = "O" - G[y][i+1] = "." - else: - break - -for _ in range(1_000): - north() - west() - south() - east() - -print(sum((H-y)*row.count('O') for y,row in enumerate(G))) diff --git a/d14/run.py b/d14/run.py new file mode 100644 index 0000000..7b4ba00 --- /dev/null +++ b/d14/run.py @@ -0,0 +1,49 @@ +import sys + +I = sys.stdin.read().splitlines() +G = [list(l) for l in I] +R = len(G) +C = len(G[0]) + +def rotate(G, F): + for r in range(R): + for c in range(C): + F[c][R-1-r] = G[r][c] + +def tilt(G): + for x in range(C): + for y in range(R): + if G[y][x] == "O": + for j in range(y-1,0-1,-1): + if G[j][x] == '.': + G[j][x] = "O" + G[j+1][x] = "." + else: + break + +score = lambda: sum((R-y)*row.count('O') for y,row in enumerate(G)) + +cache = {} +F = [['?' for _ in range(C)] for _ in range(R)] # pre-allocate saves 10% time (no GC) + +target = 1_000_000_000 +t = 0 +while t