-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaoc2012_ship.cpp
101 lines (96 loc) · 3.46 KB
/
aoc2012_ship.cpp
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
101
/* ************************************************************************** */
/* */
/* \\ /`/`` */
/* ~\o o_ 0 0\ */
/* / \__) (u ); _ _ */
/* / \/ \/ / \ \/ \/ \ */
/* /( . . ) ( )\ */
/* / \_____/ \_______/ \ */
/* [] [] [[] [[] *. */
/* []] []] [[] [[] */
/* */
/* ****************************************************************** nuo *** */
#include "iostream"
#include "sstream"
#include "vector"
int main()
{
std::vector< char > facing;
std::string s;
int shx, shy, wpx, wpy;
int val, x, y, f;
char dir;
bool shift; /// Part 2 only
facing.push_back('E');
facing.push_back('S');
facing.push_back('W');
facing.push_back('N');
shx = shy = f = x = y = 0;
wpx = 10;
wpy = 1;
while (std::cin >> s)
{
std::stringstream ss(s);
ss >> dir >> val;
shift = false;
if (dir == 'F')
{
dir = facing[f];
shx += wpx * val;
shy += wpy * val;
shift = true;
}
if (dir == 'L' || dir == 'R') /// Part 2 only
{
if (val == 180)
{
wpx = -wpx;
wpy = -wpy;
}
if ((dir == 'L' && val == 90) ||
(dir == 'R' && val == 270))
{
std::swap(wpx, wpy);
wpx = -wpx;
}
if ((dir == 'L' && val == 270) ||
(dir == 'R' && val == 90))
{
std::swap(wpx, wpy);
wpy = -wpy;
}
}
switch (dir)
{
case 'E':
x += val;
if (!shift) wpx += val;
break;
case 'W':
x -= val;
if (!shift) wpx -= val;
break;
case 'N':
y += val;
if (!shift) wpy += val;
break;
case 'S':
y -= val;
if (!shift) wpy -= val;
break;
case 'R':
val /= 90;
if ( f + val > 3 ) f = f + val - 4;
else f += val;
break;
case 'L':
val /= 90;
if ( f < val ) f = f - val + 4;
else f -= val;
break;
}
}
std::cout << "Star 1 : " << abs(x) + abs(y) << std::endl;
std::cout << "Star 2 : " << abs(shx) + abs(shy) << std::endl;
return (0);
}