aboutsummaryrefslogtreecommitdiff
path: root/2018/src
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2025-11-19 23:18:20 +0100
committerThomas Schmucker <ts@its1.de>2025-11-19 23:18:20 +0100
commit3f1e9844dbe58428e3b9528e9418c363266ceae4 (patch)
treeb06bc6369594d8bbe03d749d15018b654e4ba0a4 /2018/src
parentf29300ee1b3a3bada6297aa9b017435a5da9b17d (diff)
downloadadvent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.tar.gz
advent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.tar.bz2
advent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.zip
aoc 2018, days 13 & 14aoc-2018
Diffstat (limited to '2018/src')
-rw-r--r--2018/src/day13.cpp217
-rw-r--r--2018/src/day14.cpp88
2 files changed, 305 insertions, 0 deletions
diff --git a/2018/src/day13.cpp b/2018/src/day13.cpp
new file mode 100644
index 0000000..c764f7f
--- /dev/null
+++ b/2018/src/day13.cpp
@@ -0,0 +1,217 @@
1#include <filesystem>
2#include <fstream>
3#include <iostream>
4#include <string>
5#include <vector>
6
7using namespace std;
8
9namespace {
10
11enum class Direction : uint8_t {
12 Up,
13 Right,
14 Down,
15 Left
16};
17
18struct Cart {
19 size_t x;
20 size_t y;
21 Direction direction;
22 unsigned long intersection{};
23};
24
25using Grid = vector<string>;
26using Carts = vector<Cart>;
27
28tuple<Grid, Carts>
29read_file(const filesystem::path& filename)
30{
31 ifstream file{ filename };
32
33 Grid data;
34 Carts carts;
35
36 size_t y = 0;
37 for ( string line; getline(file, line); ) {
38 for ( size_t x = 0; x != line.size(); ++x ) {
39 using enum Direction;
40
41 const char chr = line[x];
42 if ( chr == '^' || chr == 'v' ) {
43 carts.emplace_back(x, y, chr == '^' ? Up : Down);
44 }
45 else if ( chr == '<' || chr == '>' ) {
46 carts.emplace_back(x, y, chr == '<' ? Left : Right);
47 }
48 }
49 data.emplace_back(line);
50 ++y;
51 }
52
53 return { data, carts };
54}
55
56void
57sort_carts(Carts& carts)
58{
59 ranges::sort(carts,
60 [](auto& lhs, auto& rhs) {
61 return tie(lhs.y, lhs.x) < tie(rhs.y, rhs.x);
62 });
63}
64
65void
66move_cart(Cart& cart)
67{
68 using enum Direction;
69
70 switch ( cart.direction ) {
71 case Up:
72 --cart.y;
73 break;
74 case Right:
75 ++cart.x;
76 break;
77 case Down:
78 ++cart.y;
79 break;
80 case Left:
81 --cart.x;
82 break;
83 }
84}
85
86void
87apply_direction_rules(const Grid& grid, Cart& cart)
88{
89 using enum Direction;
90
91 const char chr = grid[cart.y][cart.x];
92 switch ( chr ) {
93 case '/':
94 if ( cart.direction == Up ) {
95 cart.direction = Right;
96 }
97 else if ( cart.direction == Right ) {
98 cart.direction = Up;
99 }
100 else if ( cart.direction == Down ) {
101 cart.direction = Left;
102 }
103 else if ( cart.direction == Left ) {
104 cart.direction = Down;
105 }
106 break;
107 case '\\':
108 if ( cart.direction == Up ) {
109 cart.direction = Left;
110 }
111 else if ( cart.direction == Right ) {
112 cart.direction = Down;
113 }
114 else if ( cart.direction == Down ) {
115 cart.direction = Right;
116 }
117 else if ( cart.direction == Left ) {
118 cart.direction = Up;
119 }
120 break;
121 case '+':
122 switch ( cart.intersection++ % 3 ) {
123 case 0:
124 cart.direction = static_cast<Direction>((static_cast<int>(cart.direction) + 3) % 4);
125 break;
126 case 2:
127 cart.direction = static_cast<Direction>((static_cast<int>(cart.direction) + 1) % 4);
128 break;
129 default:
130 break;
131 };
132 break;
133 default:
134 break;
135 }
136}
137
138void
139part1(const Grid& grid, Carts carts)
140{
141 while ( true ) {
142 sort_carts(carts);
143
144 for ( size_t i = 0; i != carts.size(); ++i ) {
145 auto& cart = carts[i];
146
147 move_cart(cart);
148 apply_direction_rules(grid, cart);
149
150 for ( size_t j = 0; j != carts.size(); ++j ) {
151 if ( i == j ) {
152 continue;
153 }
154
155 const auto& other = carts[j];
156
157 if ( cart.x == other.x && cart.y == other.y ) {
158 cout << "Part 1: " << cart.x << ',' << cart.y << '\n';
159 return;
160 }
161 }
162 }
163 }
164}
165
166void
167part2(const Grid& grid, Carts carts)
168{
169 while ( true ) {
170 sort_carts(carts);
171
172 vector<size_t> carts_to_be_removed;
173
174 for ( size_t i = 0; i != carts.size(); ++i ) {
175 auto& cart = carts[i];
176
177 move_cart(cart);
178 apply_direction_rules(grid, cart);
179
180 for ( size_t j = 0; j != carts.size(); ++j ) {
181 if ( i == j ) {
182 continue;
183 }
184
185 const auto& other = carts[j];
186
187 if ( cart.x == other.x && cart.y == other.y ) {
188 carts_to_be_removed.emplace_back(i);
189 carts_to_be_removed.emplace_back(j);
190 }
191 }
192 }
193
194 // remove carts
195 ranges::sort(carts_to_be_removed);
196 ranges::reverse(carts_to_be_removed);
197
198 for ( auto num: carts_to_be_removed ) {
199 carts.erase(carts.begin() + static_cast<long>(num));
200 }
201
202 if ( carts.size() == 1 ) {
203 cout << "Part 2: " << carts[0].x << ',' << carts[0].y << '\n';
204 return;
205 }
206 }
207}
208
209} // namespace
210
211int
212main()
213{
214 auto [grid, carts] = read_file("data/day13.txt");
215 part1(grid, carts);
216 part2(grid, carts);
217}
diff --git a/2018/src/day14.cpp b/2018/src/day14.cpp
new file mode 100644
index 0000000..95d0717
--- /dev/null
+++ b/2018/src/day14.cpp
@@ -0,0 +1,88 @@
1#include <iostream>
2#include <vector>
3
4using namespace std;
5
6namespace {
7
8void
9part1(const size_t n)
10{
11 vector<size_t> v{ 3, 7 };
12 size_t first = 0;
13 size_t second = 1;
14
15 while ( v.size() < n + 10 ) {
16 auto value = v[first] + v[second];
17 if ( value >= 10 ) {
18 v.emplace_back(1);
19 value -= 10;
20 }
21 v.emplace_back(value);
22
23 first = (first + v[first] + 1) % v.size();
24 second = (second + v[second] + 1) % v.size();
25 }
26
27 cout << "Part 1: ";
28 for ( size_t i = n; i != n + 10; ++i ) {
29 cout << v[i];
30 }
31 cout << '\n';
32}
33
34void
35part2(const size_t n)
36{
37 vector<size_t> v{ 3, 7 };
38 size_t first = 0;
39 size_t second = 1;
40
41 const size_t len = to_string(n).length();
42
43 auto check = [&] {
44 if ( v.size() < len ) {
45 return false;
46 }
47
48 size_t value = 0;
49 for ( size_t i = len; i > 0; --i ) {
50 value *= 10;
51 value += v[v.size() - i];
52 }
53
54 return value == n;
55 };
56
57 for ( ;; ) {
58 auto value = v[first] + v[second];
59 if ( value >= 10 ) {
60 v.emplace_back(1);
61 if ( check() ) {
62 break;
63 }
64
65 value -= 10;
66 }
67
68 v.emplace_back(value);
69 if ( check() ) {
70 break;
71 }
72
73 first = (first + v[first] + 1) % v.size();
74 second = (second + v[second] + 1) % v.size();
75 }
76
77 cout << "Part 2: " << v.size() - len << '\n';
78}
79
80} // namespace
81
82int
83main()
84{
85 const size_t input = 607331;
86 part1(input);
87 part2(input);
88}