67 lines
1.4 KiB
Python
67 lines
1.4 KiB
Python
# PART 1
|
|
|
|
|
|
def spiral(nth):
|
|
length = 1
|
|
nth -= 1
|
|
x = 0
|
|
y = 0
|
|
while True:
|
|
x += min(length, nth)
|
|
nth -= min(length, nth)
|
|
if nth == 0:
|
|
return x, y
|
|
y += min(length, nth)
|
|
nth -= min(length, nth)
|
|
if nth == 0:
|
|
return x, y
|
|
|
|
length += 1
|
|
|
|
x -= min(length, nth)
|
|
nth -= min(length, nth)
|
|
if nth == 0:
|
|
return x, y
|
|
y -= min(length, nth)
|
|
nth -= min(length, nth)
|
|
if nth == 0:
|
|
return x, y
|
|
|
|
length += 1
|
|
|
|
|
|
def manhattan(x, y):
|
|
return abs(x) + abs(y)
|
|
|
|
|
|
# PART 2
|
|
|
|
|
|
def store(cap):
|
|
stored = {(0, 0): 1}
|
|
nth = 2
|
|
while True:
|
|
x, y = spiral(nth)
|
|
adjacent = 0
|
|
adjacent += stored.get((x - 1, y - 1), 0)
|
|
adjacent += stored.get((x, y - 1), 0)
|
|
adjacent += stored.get((x + 1, y - 1), 0)
|
|
adjacent += stored.get((x - 1, y), 0)
|
|
adjacent += stored.get((x + 1, y), 0)
|
|
adjacent += stored.get((x - 1, y + 1), 0)
|
|
adjacent += stored.get((x, y + 1), 0)
|
|
adjacent += stored.get((x + 1, y + 1), 0)
|
|
stored[(x, y)] = adjacent
|
|
nth += 1
|
|
|
|
if adjacent > cap:
|
|
return adjacent
|
|
|
|
|
|
def solve(inputstr):
|
|
nth = int(inputstr.strip())
|
|
x, y = spiral(nth)
|
|
dist = manhattan(x, y)
|
|
print(f"Part 1: {dist}")
|
|
adjacent = store(nth)
|
|
print(f"Part 2: {adjacent}")
|