from lib import get_data DIRS = { "N": (-1, 0), "E": (0, 1), "S": (1, 0), "W": (0, -1), } def part_1(data): dir_key = "E" pos = 0, 0 dirs = "NESW" for line in data.splitlines(): c = line[0] v = int(line[1:]) if c in DIRS.keys(): pos = pos[0] + v * DIRS[c][0], pos[1] + v * DIRS[c][1] elif c == "F": dir = DIRS[dir_key] pos = (pos[0] + v * dir[0], pos[1] + v * dir[1]) elif c == "R": assert v % 90 == 0 dir_key = dirs[(dirs.index(dir_key) + v // 90) % len(dirs)] elif c == "L": assert v % 90 == 0 dir_key = dirs[(dirs.index(dir_key) - v // 90) % len(dirs)] else: print(c, v) assert False print(sum(map(abs, pos))) def part_2(data): way_point = (-1, 10) pos = 0, 0 for line in data.splitlines(): c = line[0] v = int(line[1:]) if c in DIRS.keys(): way_point = way_point[0] + v * DIRS[c][0], way_point[1] + v * DIRS[c][1] elif c == "F": pos = (pos[0] + v * way_point[0], pos[1] + v * way_point[1]) elif c == "R": row, col = way_point if v == 90: way_point = (col, -row) elif v == 180: way_point = (-row, -col) elif v == 270: way_point = (-col, row) else: print(c, v) assert False elif c == "L": row, col = way_point if v == 90: way_point = (-col, row) elif v == 180: way_point = (-row, -col) elif v == 270: way_point = (col, -row) else: print(c, v) assert False else: print(c, v) assert False print(sum(map(abs, pos))) def main(): data = get_data(__file__) part_1(data) part_2(data) if __name__ == "__main__": main()