-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday12.py
100 lines (88 loc) · 3.27 KB
/
day12.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import sys, itertools
from copy import deepcopy
from typing import Dict, List, Optional, Set, Tuple
def rick_roll_parse(command:str,instr:int,x:int,y:int, facing:str) -> Tuple[Tuple[int,int],str]:
turn_left: Dict = {'N':'W','W':'S','S':'E','E':'N'}
turn_right: Dict = {'N':'E','E':'S','S':'W','W':'N'}
if command == "N":
return (x,y-instr),facing
if command == "S":
return (x,y+instr),facing
if command == "E":
return (x+instr,y),facing
if command == "W":
return (x-instr,y),facing
if command == "L":
if instr%90 != 0:
raise ValueError
turns = instr//90
for i in range(turns):
facing = turn_left[facing]
return (x,y),facing
if command == "R":
if instr%90 != 0:
raise ValueError
turns = instr//90
for i in range(turns):
facing = turn_right[facing]
return (x,y),facing
if command == "F":
if facing == "N":
return (x,y-instr),facing
if facing == "S":
return (x,y+instr),facing
if facing == "E":
return (x+instr,y),facing
if facing == "W":
return (x-instr,y),facing
print("did not find a match. Check input.")
return (x,y), facing
def never_going_to_give_you_up_parse(command:str,instr:int,waypoint_x:int, waypoint_y:int,
x:int,y:int) -> Tuple[Tuple[int,int],Tuple[int,int]]:
if command == "N":
return (waypoint_x,waypoint_y-instr),(x,y)
if command == "S":
return (waypoint_x,waypoint_y+instr),(x,y)
if command == "E":
return (waypoint_x+instr,waypoint_y),(x,y)
if command == "W":
return (waypoint_x-instr,waypoint_y),(x,y)
if command == "L":
if instr%90 != 0:
raise ValueError
turns = instr//90
while turns != 0:
waypoint_x,waypoint_y = waypoint_y, - waypoint_x
turns -= 1
return (waypoint_x,waypoint_y), (x,y)
if command == "R":
if instr%90 != 0:
raise ValueError
turns = instr//90
while turns != 0:
waypoint_x,waypoint_y = - waypoint_y, waypoint_x
#print(waypoint_x, waypoint_y)
turns -= 1
return (waypoint_x,waypoint_y), (x,y)
if command == "F":
return (waypoint_x,waypoint_y),(x+waypoint_x*instr,y+waypoint_y*instr)
print("did not find a match. Check input.")
return (waypoint_x,waypoint_y), (x,y)
def main(args: List[str]) -> int:
with open(args[1], 'r') as f:
l = [[l[0],int(l[1:])] for line in f for l in line.strip().split()]
#print(f'{l}')
x,y, facing = 0,0, 'E'
for instructions in l:
(x,y), facing = rick_roll_parse(instructions[0],instructions[1],x,y,facing)
#print(f'{x},{y}: {facing}')
print(f'part 1 ans: {abs(x)+abs(y)}')
waypoint_x,waypoint_y,x,y = 10,-1,0,0
for instructions in l:
(waypoint_x,waypoint_y), (x,y) = never_going_to_give_you_up_parse(
instructions[0],instructions[1],waypoint_x,waypoint_y,x,y)
print(f'waypoint: {waypoint_x},{waypoint_y} boat: {x},{y}')
print(f'part 2 ans: {abs(x)+abs(y)}')
return 0
if __name__ == '__main__':
sys.exit( main( sys.argv ) )