diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 10:59:17 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 10:59:17 +0800 |
commit | 19663fdfb6c2c61ee6f31c03cfe5277253cfa44e (patch) | |
tree | d80b477d6a2c406663d87caaf253628a632a653e /src/2018/day2/aoc.cpp | |
parent | 5e9ceee3104714002bb9e0aaffef78ef12e27fc6 (diff) | |
download | advent-of-code-19663fdfb6c2c61ee6f31c03cfe5277253cfa44e.tar.gz advent-of-code-19663fdfb6c2c61ee6f31c03cfe5277253cfa44e.zip |
2018 day2
Diffstat (limited to 'src/2018/day2/aoc.cpp')
-rw-r--r-- | src/2018/day2/aoc.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/2018/day2/aoc.cpp b/src/2018/day2/aoc.cpp index 585f144..fd7e8e6 100644 --- a/src/2018/day2/aoc.cpp +++ b/src/2018/day2/aoc.cpp @@ -1,5 +1,61 @@ #include "aoc.h" +#include <vector> namespace aoc2018 { +int exactly(const ascii_count& ac, int x) { + for (char i = 'a'; i <= 'z'; i++) { + if (ac.count[int(i)] == x) { + return 1; + } + } + return 0; } + +bool almost(line_view lv1, line_view lv2, char comm[]) { + const char* p1 = lv1.line; + const char* p2 = lv2.line; + int x{0}; + int i{0}; + while (p1 < lv1.line + lv1.length - 1 && x < 2) { + if (*p1 == *p2) { + comm[i++] = *p1; + } else { + x++; + } + p1++; + p2++; + } + return x == 1; +} + +void diff(size_t i, const std::vector<line_view>& ls, char comm[]) { + if (i < ls.size() - 1) { + for (size_t j = i + 1; j < ls.size(); j++) { + if (almost(ls[i], ls[j], comm)) { + return; + } + } + diff(i + 1, ls, comm); + } +} + +int day2(line_view file, char comm[]) { + int exactly2{0}; + int exactly3{0}; + std::vector<line_view> ls; + + per_line(file, [&exactly2, &exactly3, &ls](line_view lv) { + ls.push_back(lv); + ascii_count ac(lv); + exactly2 += exactly(ac, 2); + exactly3 += exactly(ac, 3); + return true; + }); + + diff(0, ls, comm); + + return exactly2 * exactly3; +} + +} // namespace aoc2018 |