AdventOfCode/Python/2023/14/main.py

109 lines
2.5 KiB
Python
Raw Permalink Normal View History

2023-12-13 23:20:33 -08:00
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)