48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
|
import sys
|
||
|
|
||
|
|
||
|
def main():
|
||
|
codes = [(line[0], int(line.rstrip()[1:])) for line in sys.stdin]
|
||
|
|
||
|
# Part 1
|
||
|
x, y = 0, 0
|
||
|
dofs = [(1, 0), (0, -1), (-1, 0), (0, 1)] # E S W N
|
||
|
dmap = {di: do for di, do in zip("ESWN", dofs)}
|
||
|
f = 0
|
||
|
for ci, cv in codes:
|
||
|
if (dd := dmap.get(ci)):
|
||
|
dx, dy = dd
|
||
|
x, y = x + dx * cv, y + dy * cv
|
||
|
elif ci in "LR":
|
||
|
r = cv // 90
|
||
|
f = (f - r if ci == "L" else f + r) % 4
|
||
|
else: # F
|
||
|
dx, dy = dofs[f]
|
||
|
x, y = x + dx * cv, y + dy * cv
|
||
|
print("Manhattan distance:", abs(x) + abs(y))
|
||
|
|
||
|
# Part 2
|
||
|
x, y = 0, 0
|
||
|
wx, wy = 10, 1
|
||
|
for ci, cv in codes:
|
||
|
if (dd := dmap.get(ci)):
|
||
|
dx, dy = dd
|
||
|
wx, wy = wx + dx * cv, wy + dy * cv
|
||
|
elif ci in "LR": # what are matrices
|
||
|
dx, dy = wx - x, wy - y
|
||
|
if (ci, cv) in (("R", 90), ("L", 270)):
|
||
|
wx, wy = x + dy, y - dx
|
||
|
elif (ci, cv) in (("R", 270), ("L", 90)):
|
||
|
wx, wy = x - dy, y + dx
|
||
|
else: # 180°
|
||
|
wx, wy = x - dx, y - dy
|
||
|
else: # F
|
||
|
dx, dy = wx - x, wy - y
|
||
|
x, y = x + dx * cv, y + dy * cv
|
||
|
wx, wy = x + dx, y + dy
|
||
|
print("Manhattan distance part 2:", abs(x) + abs(y))
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|