97 lines
2.1 KiB
Python
97 lines
2.1 KiB
Python
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')
|
|
|
|
|