aboutsummaryrefslogtreecommitdiff
path: root/2024/src
diff options
context:
space:
mode:
Diffstat (limited to '2024/src')
-rw-r--r--2024/src/day02.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/2024/src/day02.cpp b/2024/src/day02.cpp
new file mode 100644
index 0000000..c8ca66f
--- /dev/null
+++ b/2024/src/day02.cpp
@@ -0,0 +1,76 @@
1#include <cstddef>
2#include <fstream>
3#include <iostream>
4#include <sstream>
5#include <string>
6#include <vector>
7using namespace std;
8
9vector<vector<long>>
10read_file(string_view filename)
11{
12 fstream input{ filename };
13 vector<vector<long>> lines;
14
15 auto split = [](const string& str) {
16 stringstream sstr{ str };
17 vector<long> values;
18
19 for ( long value = 0; sstr >> value; ) {
20 values.emplace_back(value);
21 }
22 return values;
23 };
24
25 for ( string line; getline(input, line); ) {
26 lines.emplace_back(split(line));
27 }
28
29 return lines;
30}
31
32bool
33is_safe(const vector<long>& values)
34{
35 vector<long> diffs;
36 for ( size_t i = 1; i < values.size(); ++i ) {
37 diffs.emplace_back(values.at(i) - values.at(i - 1));
38 }
39
40 auto all_negative = ranges::all_of(diffs, [](auto diff) { return diff >= -3 && diff < 0; });
41 auto all_positive = ranges::all_of(diffs, [](auto diff) { return diff <= 3 && diff > 0; });
42
43 return all_positive || all_negative;
44}
45
46void
47part1(const vector<vector<long>>& lines)
48{
49 cout << ranges::count_if(lines, is_safe) << endl;
50}
51
52void
53part2(const vector<vector<long>>& lines)
54{
55 long safe_count = 0;
56 for ( const auto& line: lines ) {
57 auto safe = false;
58 for ( size_t i = 0; i != line.size(); ++i ) {
59 auto copy = line;
60 copy.erase(copy.begin() + ptrdiff_t(i));
61 safe |= is_safe(copy);
62 }
63 if ( safe ) {
64 ++safe_count;
65 }
66 }
67 cout << safe_count << endl;
68}
69
70int
71main()
72{
73 auto lines = read_file("data/day02.txt");
74 part1(lines);
75 part2(lines);
76}