aoc2017/day03.py
2022-11-19 21:15:35 +01:00

57 lines
1.4 KiB
Python

from tools.aoc import AOCDay
from tools.coordinate import Coordinate
from tools.grid import Grid
from typing import Any
def build_grid(max_num: int, p2: bool = False) -> (Grid, Coordinate, int):
grid = Grid(0)
grid.set(Coordinate(0, 0), 1)
last_coord = Coordinate(0, 0)
last_num = max_num
dirs = [(-1, 0), (0, 1), (1, 0), (0, -1)]
dir_index = 2
cur_dir = dirs[dir_index]
check_dir = dirs[dir_index + 1]
for x in range(2, max_num + 1):
last_coord += Coordinate(*cur_dir)
if not p2:
grid.set(last_coord, x)
else:
sum = grid.getNeighbourSum(last_coord)
grid.set(last_coord, sum)
if sum > max_num:
return grid, last_coord, sum
if not grid.get(last_coord + Coordinate(*check_dir)):
dir_index = (dir_index + 1) % 4
cur_dir = dirs[dir_index]
check_dir = dirs[(dir_index + 1) % 4]
return grid, last_coord, last_num
class Day(AOCDay):
inputs = [
[
(31, "input3_test"),
(438, "input3")
],
[
(266330, "input3")
]
]
def part1(self) -> Any:
g, c, _ = build_grid(int(self.getInput()))
return abs(c.x) + abs(c.y)
def part2(self) -> Any:
g, c, i = build_grid(int(self.getInput()), True)
return i
if __name__ == '__main__':
day = Day(2017, 3)
day.run(verbose=True)