From 24f1afb01469053cec6cce3e4ed5e27844867f31 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 13 Dec 2023 23:20:33 -0800 Subject: [PATCH] 2023 dec 14th --- Python/2023/14/main.py | 108 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 Python/2023/14/main.py diff --git a/Python/2023/14/main.py b/Python/2023/14/main.py new file mode 100644 index 0000000..cfe4001 --- /dev/null +++ b/Python/2023/14/main.py @@ -0,0 +1,108 @@ +import numpy as np +import functools + +input = open("input", 'r')#.read() + +data = [] + +for i, line in enumerate(input): + line = line.rstrip() + data.append(list(line)) + +def printA(A): + for row in A: + print("".join(row)) + print() + +def tilt(): + for j, row in enumerate(data): + for i, char in enumerate(row): + moveto = j + if char == "O": + while moveto-1 >= 0 and data[moveto-1][i] == ".": + moveto -= 1 + data[j][i] = "." + data[moveto][i] = "O" + +def load(): + load = [] + + for j, row in enumerate(data): + for i, char in enumerate(row): + if char == "O": + load.append(len(data)-j) + + return sum(load) + +def cycle(): + # North + for j, row in enumerate(data): + for i, char in enumerate(row): + moveto = j + if char == "O": + while moveto-1 >= 0 and data[moveto-1][i] == ".": + moveto -= 1 + data[j][i] = "." + data[moveto][i] = "O" + # West + for j, row in enumerate(data): + for i, char in enumerate(row): + moveto = i + if char == "O": + while moveto-1 >= 0 and data[j][moveto-1] == ".": + moveto -= 1 + data[j][i] = "." + data[j][moveto] = "O" + # South + for j in range(len(data)-1, -1, -1): + row = data[j] + for i, char in enumerate(row): + char = row[i] + moveto = j + if char == "O": + while moveto+1 < len(row) and data[moveto+1][i] == ".": + moveto += 1 + data[j][i] = "." + data[moveto][i] = "O" + # East + for j, row in enumerate(data): + for i in range(len(row)-1, -1, -1): + char = row[i] + moveto = i + if char == "O": + while moveto+1 < len(row) and data[j][moveto+1] == ".": + moveto += 1 + data[j][i] = "." + data[j][moveto] = "O" + +def dataStr(data): + return "".join(["".join(row) for row in data]) + +# Part 1 + +# tilt() +# print(load()) + +# Part 2 + +datadict = {} +target = 1000000000 +i = 1 + +load_val = None + +while load_val == None: + cycle() + strdata = dataStr(data) + + if strdata in datadict: + old_i = datadict[strdata][0] + cycle = i - old_i + for j,loaded in datadict.values(): + if j >= old_i and j % cycle == target % cycle: + load_val = loaded + + datadict[strdata] = (i, load()) + i += 1 + +print(load_val)