Advent-of-Code/2018/day11.py
2019-11-19 01:22:23 +01:00

83 lines
2.3 KiB
Python

""" https://adventofcode.com/2018/day/11 """
def readFile():
import os.path as p
dName = p.dirname(__file__)
fName = p.basename(__file__).split(".")[0]
with open(p.join(dName, "input", f"{fName}.txt"), "r") as f:
return int(f.read())
def getPowerlevel(x, y, serial):
rackId = x + 10
powerLevel = (rackId * y + serial) * rackId
return (int(powerLevel / 100) % 10) - 5
def createGrid(serial):
grid = []
for j in range(1, 301):
row = []
for i in range(1, 301):
row.append(getPowerlevel(i, j, serial))
grid.append(row)
return grid
def getBiggestField(grid, size):
maxSum = 0
maxCoords = (-1, -1)
for j in range(300 - size + 1):
for i in range(300 - size + 1):
curSum = 0
for n in range(size):
for m in range(size):
curSum += grid[j + m][i + n]
if curSum > maxSum:
maxSum = curSum
maxCoords = (i + 1, j + 1)
return maxCoords, maxSum
def getSat(grid):
# generates and returns summed-area table
sat = {}
size = len(grid)
for j in range(size):
for i in range(size):
value = grid[j][i] + sat.get(str((i - 1, j)), 0)
value += sat.get(str((i, j - 1)), 0) - sat.get(str((i - 1, j - 1)), 0)
sat[str((i, j))] = value
return sat
def getBiggestFieldSAT(sat, size):
maxSum = 0
maxCoords = (-1, -1)
for j in range(300 - size):
for i in range(300 - size):
ip, jp = i + size, j + size
curSum = sat[str((i, j))] + sat[str((ip, jp))] - sat[str((ip, j))] - sat[str((i, jp))]
if curSum > maxSum:
maxSum = curSum
maxCoords = (i + 2, j + 2)
return maxCoords, maxSum
def part1(value):
grid = createGrid(value)
return getBiggestField(grid, 3)
def part2(value):
grid = createGrid(value)
sat = getSat(grid)
maxSum = 0
size = -1
maxCoords = (-1, -1)
for i in range(300):
curCoords, curSum = getBiggestFieldSAT(sat, i)
if curSum > maxSum:
maxSum = curSum
size = i
maxCoords = curCoords
return (maxCoords[0], maxCoords[1], size)
if __name__ == "__main__":
value = readFile()
print(f"Part 1: {part1(value)}")
print(f"Part 2: {part2(value)}")