57 lines
1.4 KiB
Python
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)
|