diff --git a/py/2017/03/solve.py b/py/2017/03/solve.py deleted file mode 100644 index 2d544d9..0000000 --- a/py/2017/03/solve.py +++ /dev/null @@ -1,64 +0,0 @@ -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() diff --git a/py/aoc/__init__.py b/py/aoc/__init__.py index b7e5d02..3b5c43b 100644 --- a/py/aoc/__init__.py +++ b/py/aoc/__init__.py @@ -2,7 +2,7 @@ import sys import argparse from pathlib import Path -from .y2017 import d01, d02 +from .y2017 import d01, d02, d03 from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11 from .y2020 import d10 from .y2021 import d14 @@ -11,6 +11,7 @@ from .y2022 import d01, d02, d03, d04, d05, d06 DAYS = { "2017_01": y2017.d01.solve, "2017_02": y2017.d02.solve, + "2017_03": y2017.d03.solve, "2018_01": y2018.d01.solve, "2018_02": y2018.d02.solve, "2018_03": y2018.d03.solve, diff --git a/py/aoc/y2017/d03.py b/py/aoc/y2017/d03.py new file mode 100644 index 0000000..6f5014d --- /dev/null +++ b/py/aoc/y2017/d03.py @@ -0,0 +1,67 @@ +# 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}")