diff options
| author | Thomas Schmucker <ts@its1.de> | 2024-12-02 21:48:58 +0100 |
|---|---|---|
| committer | Thomas Schmucker <ts@its1.de> | 2024-12-02 21:48:58 +0100 |
| commit | b45dd9596200dcdbb4c91c8ab05f7dcfde302af4 (patch) | |
| tree | 4ea471e065bbf65dc31f511157686bd943037d66 | |
| parent | ce66d4d5a7b67cc5a36dd4dc1a85e0c7129ea5d6 (diff) | |
| download | advent-of-code-b45dd9596200dcdbb4c91c8ab05f7dcfde302af4.tar.gz advent-of-code-b45dd9596200dcdbb4c91c8ab05f7dcfde302af4.tar.bz2 advent-of-code-b45dd9596200dcdbb4c91c8ab05f7dcfde302af4.zip | |
cleanup
| -rw-r--r-- | 2024/src/day02.cpp | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/2024/src/day02.cpp b/2024/src/day02.cpp index c8ca66f..e3597a3 100644 --- a/2024/src/day02.cpp +++ b/2024/src/day02.cpp | |||
| @@ -1,4 +1,3 @@ | |||
| 1 | #include <cstddef> | ||
| 2 | #include <fstream> | 1 | #include <fstream> |
| 3 | #include <iostream> | 2 | #include <iostream> |
| 4 | #include <sstream> | 3 | #include <sstream> |
| @@ -12,11 +11,11 @@ read_file(string_view filename) | |||
| 12 | fstream input{ filename }; | 11 | fstream input{ filename }; |
| 13 | vector<vector<long>> lines; | 12 | vector<vector<long>> lines; |
| 14 | 13 | ||
| 15 | auto split = [](const string& str) { | 14 | auto split = [](const string& line) { |
| 16 | stringstream sstr{ str }; | 15 | stringstream line_stream{ line }; |
| 17 | vector<long> values; | 16 | vector<long> values; |
| 18 | 17 | ||
| 19 | for ( long value = 0; sstr >> value; ) { | 18 | for ( long value = 0; line_stream >> value; ) { |
| 20 | values.emplace_back(value); | 19 | values.emplace_back(value); |
| 21 | } | 20 | } |
| 22 | return values; | 21 | return values; |
| @@ -25,7 +24,6 @@ read_file(string_view filename) | |||
| 25 | for ( string line; getline(input, line); ) { | 24 | for ( string line; getline(input, line); ) { |
| 26 | lines.emplace_back(split(line)); | 25 | lines.emplace_back(split(line)); |
| 27 | } | 26 | } |
| 28 | |||
| 29 | return lines; | 27 | return lines; |
| 30 | } | 28 | } |
| 31 | 29 | ||
| @@ -43,6 +41,19 @@ is_safe(const vector<long>& values) | |||
| 43 | return all_positive || all_negative; | 41 | return all_positive || all_negative; |
| 44 | } | 42 | } |
| 45 | 43 | ||
| 44 | bool | ||
| 45 | is_real_safe(const vector<long>& values) | ||
| 46 | { | ||
| 47 | for ( size_t i = 0; i != values.size(); ++i ) { | ||
| 48 | auto values_copy = values; | ||
| 49 | values_copy.erase(values_copy.begin() + ptrdiff_t(i)); | ||
| 50 | if ( is_safe(values_copy) ) { | ||
| 51 | return true; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | return false; | ||
| 55 | } | ||
| 56 | |||
| 46 | void | 57 | void |
| 47 | part1(const vector<vector<long>>& lines) | 58 | part1(const vector<vector<long>>& lines) |
| 48 | { | 59 | { |
| @@ -52,19 +63,7 @@ part1(const vector<vector<long>>& lines) | |||
| 52 | void | 63 | void |
| 53 | part2(const vector<vector<long>>& lines) | 64 | part2(const vector<vector<long>>& lines) |
| 54 | { | 65 | { |
| 55 | long safe_count = 0; | 66 | cout << ranges::count_if(lines, is_real_safe) << endl; |
| 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 | } | 67 | } |
| 69 | 68 | ||
| 70 | int | 69 | int |
