64 lines
1.2 KiB
Python
64 lines
1.2 KiB
Python
import sys
|
|
|
|
# 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 main():
|
|
nth = 277678
|
|
print(f"Solutions")
|
|
x, y = spiral(nth)
|
|
dist = manhattan(x, y)
|
|
print(f"Part 1: {dist}")
|
|
adjacent = store(nth)
|
|
print(f"Part 2: {adjacent}")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|