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()