aboutsummaryrefslogtreecommitdiff
path: root/src/2016/day3/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-05 15:22:55 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-05 15:22:55 +0800
commit8263b5724c410e5f90dcf1ec146f40c1497278a9 (patch)
treee33f52fbc67d676b2641504c11a6c2c09fa023cc /src/2016/day3/aoc.cpp
parent010538003f2b7432c0be4912665a5af79b9bb2cf (diff)
downloadadvent-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.cpp46
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