diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 15:22:55 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-05 15:22:55 +0800 |
commit | 8263b5724c410e5f90dcf1ec146f40c1497278a9 (patch) | |
tree | e33f52fbc67d676b2641504c11a6c2c09fa023cc /src/2016/day3/aoc.cpp | |
parent | 010538003f2b7432c0be4912665a5af79b9bb2cf (diff) | |
download | advent-of-code-8263b5724c410e5f90dcf1ec146f40c1497278a9.tar.gz advent-of-code-8263b5724c410e5f90dcf1ec146f40c1497278a9.zip |
2016 day3
Diffstat (limited to 'src/2016/day3/aoc.cpp')
-rw-r--r-- | src/2016/day3/aoc.cpp | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/2016/day3/aoc.cpp b/src/2016/day3/aoc.cpp index bd10b4f..41267b0 100644 --- a/src/2016/day3/aoc.cpp +++ b/src/2016/day3/aoc.cpp @@ -11,9 +11,8 @@ void get_number(const char** pp, int* d) { *pp = p; } -bool is_triangle(line_view lv) { +void get_sides(line_view lv, int is[]) { const char* p = lv.line; - int is[3] = {0}; size_t i{0}; while (p < lv.line + lv.length) { if (*p >= '0' && *p <= '9') { @@ -21,19 +20,50 @@ bool is_triangle(line_view lv) { } p++; } +} + +int is_triangle(int is[]) { auto b1 = is[0] + is[1] > is[2]; auto b2 = is[0] + is[2] > is[1]; auto b3 = is[1] + is[2] > is[0]; - return b1 && b2 && b3; + return int(b1 && b2 && b3); } -int day3(line_view file) { - int total{0}; - per_line(file, [&total](line_view lv) { - total += int(is_triangle(lv)); +int has_triangle(int is[]) { + auto b1 = is[0] + is[3] > is[6]; + auto b2 = is[0] + is[6] > is[3]; + auto b3 = is[3] + is[6] > is[0]; + + auto b4 = is[1] + is[4] > is[7]; + auto b5 = is[1] + is[7] > is[4]; + auto b6 = is[4] + is[7] > is[1]; + + auto b7 = is[2] + is[5] > is[8]; + auto b8 = is[2] + is[8] > is[5]; + auto b9 = is[5] + is[8] > is[2]; + + return int(b1 && b2 && b3) + int(b4 && b5 && b6) + int(b7 && b8 && b9); +} + +std::pair<int, int> day3(line_view file) { + int t0{0}; + int t1{0}; + size_t i{0}; + const char* p = file.line; + per_line(file, [&t0, &t1, &i, &p](line_view lv) { + i++; + if (i % 3 == 0) { + int xs[9] = {0}; + get_sides(line_view{p, lv.line + lv.length}, xs); + t1 += has_triangle(xs); + p = lv.line + lv.length + 1; + } + int is[3] = {0}; + get_sides(lv, is); + t0 += is_triangle(is); return true; }); - return total; + return {t0, t1}; } } // namespace aoc2016 |