aboutsummaryrefslogtreecommitdiff
path: root/2024
diff options
context:
space:
mode:
Diffstat (limited to '2024')
-rw-r--r--2024/src/day09.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/2024/src/day09.cpp b/2024/src/day09.cpp
new file mode 100644
index 0000000..dd25a9d
--- /dev/null
+++ b/2024/src/day09.cpp
@@ -0,0 +1,58 @@
1#include <fstream>
2#include <iostream>
3#include <iterator>
4#include <string>
5using namespace std;
6
7vector<int>
8read_file(string_view filename)
9{
10 fstream input{ filename };
11 string line;
12 int fid = 0;
13
14 getline(input, line);
15
16 vector<int> data;
17 for ( size_t i = 0; i != line.size(); ++i ) {
18 vector<int> values(size_t(line.at(i) - '0'), (i % 2 == 0) ? fid++ : -1);
19 data.insert(data.end(), values.begin(), values.end());
20 }
21 return data;
22}
23
24void
25part1(const vector<int>& data)
26{
27 vector<int> result;
28
29 auto lhs = data.begin();
30 auto rhs = data.end();
31
32 while ( lhs != rhs ) {
33 if ( *lhs != -1 ) {
34 result.push_back(*lhs);
35 }
36 else {
37 --rhs;
38 while ( *rhs == -1 ) {
39 --rhs;
40 }
41 result.push_back(*rhs);
42 }
43 ++lhs;
44 }
45
46 long sum = 0;
47 for ( size_t i = 0; i != result.size(); ++i ) {
48 sum += long(i) * result.at(i);
49 }
50 cout << sum << endl;
51}
52
53int
54main()
55{
56 auto data = read_file("data/day09.txt");
57 part1(data);
58}