from aoc.input import get_input import copy import itertools import time import collections import re from aoc.partselector import part_one, part_two import functools def pw(line): l = line.strip() return l[0], int(l[1:]) def p1(): inp = get_input(pw) go = { 'N': (0, -1), 'S': (0, 1), 'W': (-1, 0), 'E': (1, 0), } pos = (0, 0) doffset = 1 for sample in inp: print(sample) d, v, = sample if sample[0] in 'NWSE': pos = (pos[0] + sample[1]*go[d][0],pos[1] + sample[1]*go[d][1]) if d == 'L': doffset -= v//90 if d == 'R': doffset += v//90 if d == 'F': di = 'NESW' d = di[doffset%4] pos = (pos[0] + sample[1]*go[d][0],pos[1] + sample[1]*go[d][1]) print(pos) print(pos) print(abs(pos[0]) + abs(pos[1])) return inp def p2(inp): go = { 'N': (0, -1), 'S': (0, 1), 'W': (-1, 0), 'E': (1, 0), } pos = (0, 0) wp = (10, -1) doffset = 1 for sample in inp: print(sample) d, v, = sample if sample[0] in 'NWSE': wp = (wp[0] + sample[1]*go[d][0],wp[1] + sample[1]*go[d][1]) if d == 'L': doffset -= v//90 dd = (v//90)%4 if dd == 2: wp = (-wp[0], -wp[1]) if dd == 1: wp = (wp[1], -wp[0]) if dd == 3: wp = (-wp[1], wp[0]) if d == 'R': dd = (v//90)%4 if dd == 2: wp = (-wp[0], -wp[1]) if dd == 3: wp = (wp[1], -wp[0]) if dd == 1: wp = (-wp[1], wp[0]) if d == 'F': pos = (pos[0] + sample[1]*wp[0],pos[1] + sample[1]*wp[1]) print(pos, wp) print(abs(pos[0]) + abs(pos[1])) return 0 result1 = None if part_one(): start = time.time() result1 = p1() print(round(1000*(time.time() - start), 2), 'ms') if part_two(): start = time.time() p2(result1) print(round(1000*(time.time() - start), 2), 'ms')