diff options
| -rw-r--r-- | 2025/src/day02.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/2025/src/day02.cpp b/2025/src/day02.cpp index 1d17cd9..f19f386 100644 --- a/2025/src/day02.cpp +++ b/2025/src/day02.cpp | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #include <filesystem> | 1 | #include <filesystem> |
| 2 | #include <fstream> | 2 | #include <fstream> |
| 3 | #include <iostream> | 3 | #include <iostream> |
| 4 | #include <ranges> | 4 | #include <regex> |
| 5 | #include <sstream> | 5 | #include <sstream> |
| 6 | #include <string> | 6 | #include <string> |
| 7 | #include <vector> | 7 | #include <vector> |
| @@ -77,6 +77,18 @@ part1(const vector<tuple<long, long>>& ranges) | |||
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | void | 79 | void |
| 80 | part1_regex(const vector<tuple<long, long>>& ranges) | ||
| 81 | { | ||
| 82 | const regex regex{ R"(^(\d+)\1$)" }; | ||
| 83 | |||
| 84 | auto is_invalid = [&](long num) { | ||
| 85 | return regex_search(to_string(num), regex); | ||
| 86 | }; | ||
| 87 | |||
| 88 | cout << "Part 1 (regex): " << accumulate_invalids(ranges, is_invalid) << '\n'; | ||
| 89 | } | ||
| 90 | |||
| 91 | void | ||
| 80 | part2(const vector<tuple<long, long>>& ranges) | 92 | part2(const vector<tuple<long, long>>& ranges) |
| 81 | { | 93 | { |
| 82 | auto is_invalid = [](long num) { | 94 | auto is_invalid = [](long num) { |
| @@ -104,12 +116,40 @@ part2(const vector<tuple<long, long>>& ranges) | |||
| 104 | cout << "Part 2: " << accumulate_invalids(ranges, is_invalid) << '\n'; | 116 | cout << "Part 2: " << accumulate_invalids(ranges, is_invalid) << '\n'; |
| 105 | } | 117 | } |
| 106 | 118 | ||
| 119 | void | ||
| 120 | part2_regex(const vector<tuple<long, long>>& ranges) | ||
| 121 | { | ||
| 122 | const regex regex{ R"(^(\d+)\1+$)" }; | ||
| 123 | |||
| 124 | auto is_invalid = [&](long num) { | ||
| 125 | return regex_search(to_string(num), regex); | ||
| 126 | }; | ||
| 127 | |||
| 128 | cout << "Part 2 (regex): " << accumulate_invalids(ranges, is_invalid) << '\n'; | ||
| 129 | } | ||
| 130 | |||
| 131 | void | ||
| 132 | part2_kmp(const vector<tuple<long, long>>& ranges) | ||
| 133 | { | ||
| 134 | auto is_invalid = [](long num) { | ||
| 135 | const auto str = to_string(num); | ||
| 136 | return (str + str).find(str, 1) < str.size(); | ||
| 137 | }; | ||
| 138 | |||
| 139 | cout << "Part 2 (kmp): " << accumulate_invalids(ranges, is_invalid) << '\n'; | ||
| 140 | } | ||
| 141 | |||
| 107 | } // namespace | 142 | } // namespace |
| 108 | 143 | ||
| 109 | int | 144 | int |
| 110 | main() | 145 | main() |
| 111 | { | 146 | { |
| 112 | auto ranges = read_file("data/day02.txt"); | 147 | auto ranges = read_file("data/day02.txt"); |
| 148 | |||
| 113 | part1(ranges); | 149 | part1(ranges); |
| 150 | part1_regex(ranges); | ||
| 151 | |||
| 114 | part2(ranges); | 152 | part2(ranges); |
| 153 | part2_regex(ranges); | ||
| 154 | part2_kmp(ranges); | ||
| 115 | } | 155 | } |
