aboutsummaryrefslogtreecommitdiff
path: root/2024/src/day01.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2024/src/day01.cpp')
-rw-r--r--2024/src/day01.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/2024/src/day01.cpp b/2024/src/day01.cpp
new file mode 100644
index 0000000..61b3c29
--- /dev/null
+++ b/2024/src/day01.cpp
@@ -0,0 +1,72 @@
1#include <algorithm>
2#include <cstdlib>
3#include <fstream>
4#include <iostream>
5#include <map>
6#include <tuple>
7#include <vector>
8using namespace std;
9
10vector<tuple<long, long>>
11read_file(string_view filename)
12{
13 fstream input{ filename };
14 vector<tuple<long, long>> data;
15
16 long lhs = 0;
17 long rhs = 0;
18
19 while ( input >> lhs >> rhs ) {
20 data.emplace_back(lhs, rhs);
21 }
22
23 return data;
24}
25
26void
27part1(const vector<tuple<long, long>>& data)
28{
29 vector<long> lefts;
30 vector<long> rights;
31
32 for ( const auto& [lhs, rhs]: data ) {
33 lefts.emplace_back(lhs);
34 rights.emplace_back(rhs);
35 }
36
37 sort(lefts.begin(), lefts.end());
38 sort(rights.begin(), rights.end());
39
40 long total_distance = 0;
41 for ( size_t i = 0; i != lefts.size(); ++i ) {
42 long distance = abs(lefts[i] - rights[i]);
43 total_distance += distance;
44 }
45 cout << total_distance << endl;
46}
47
48void
49part2(const vector<tuple<long, long>>& data)
50{
51 vector<long> lefts;
52 map<long, long> rights;
53
54 for ( const auto& [lhs, rhs]: data ) {
55 lefts.emplace_back(lhs);
56 rights[rhs]++;
57 }
58
59 long score = 0;
60 for ( const auto& lhs: lefts ) {
61 score += lhs * rights[lhs];
62 }
63 cout << score << endl;
64}
65
66int
67main()
68{
69 auto data = read_file("data/day01.txt");
70 part1(data);
71 part2(data);
72}