[py] Port 2016_01

This commit is contained in:
Joscha 2022-12-06 19:55:11 +01:00
parent d27285ef23
commit bd2e910569
3 changed files with 75 additions and 74 deletions

73
py/aoc/y2016/d01.py Normal file
View file

@ -0,0 +1,73 @@
def load_steps(inputstr):
steps = []
for step in inputstr[:-1].split(","):
step = step.strip()
step = (step[0], int(step[1:]))
steps.append(step)
return steps
# PART 1
def turn(direction, where):
dir_x, dir_y = direction
if where == "R":
return (dir_y, -dir_x)
elif where == "L":
return (-dir_y, dir_x)
else:
raise Exception("HEY! Don't do that!")
def manhattan(position):
x, y = position
return abs(x) + abs(y)
def find_distance(steps):
pos_x, pos_y = 0, 0
direction = (1, 0)
for step in steps:
where, amount = step
direction = turn(direction, where)
dir_x, dir_y = direction
pos_x += dir_x * amount
pos_y += dir_y * amount
return manhattan((pos_x, pos_y))
# PART 2
def first_visited_twice(steps):
pos_x, pos_y = 0, 0
direction = (1, 0)
visited = {(pos_x, pos_y)}
for step in steps:
where, amount = step
direction = turn(direction, where)
dir_x, dir_y = direction
for i in range(amount):
pos_x += dir_x
pos_y += dir_y
position = (pos_x, pos_y)
if position in visited:
return position
else:
visited.add(position)
def solve(inputstr):
steps = load_steps(inputstr)
distance = find_distance(steps)
print(f"Part 1: {distance}")
pos = first_visited_twice(steps)
distance_2 = manhattan(pos)
print(f"Part 2: {distance_2}")