aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day2/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-04 23:26:13 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-04 23:26:13 +0800
commit5e9ceee3104714002bb9e0aaffef78ef12e27fc6 (patch)
tree3584347b9d1a3f680c51cd199aefdf3cf03a1517 /src/2017/day2/aoc.cpp
parente69e1b40bc7467044ac5a6652a45c8f43c6cb7a2 (diff)
downloadadvent-of-code-5e9ceee3104714002bb9e0aaffef78ef12e27fc6.tar.gz
advent-of-code-5e9ceee3104714002bb9e0aaffef78ef12e27fc6.zip
2017 day2
Diffstat (limited to 'src/2017/day2/aoc.cpp')
-rw-r--r--src/2017/day2/aoc.cpp37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/2017/day2/aoc.cpp b/src/2017/day2/aoc.cpp
index 9069bd3..5c09411 100644
--- a/src/2017/day2/aoc.cpp
+++ b/src/2017/day2/aoc.cpp
@@ -1,4 +1,5 @@
#include "aoc.h"
+#include <vector>
namespace aoc2017 {
@@ -13,7 +14,27 @@ int get_number(const char** pp) {
return d;
}
-int diff(line_view lv) {
+int evenly_divisible(int x, int y) {
+ int max = std::max(x, y);
+ int min = std::min(x, y);
+ return max % min == 0 ? max / min : 0;
+}
+
+int diff(size_t i, const std::vector<int>& v) {
+ if (i == v.size() - 1) {
+ return 0;
+ } else {
+ for (size_t j = i + 1; j < v.size(); j++) {
+ int d = evenly_divisible(v[i], v[j]);
+ if (d > 0) {
+ return d;
+ }
+ }
+ return diff(i + 1, v);
+ }
+}
+
+int diff(line_view lv, std::vector<int>& v) {
int max{INT_MIN};
int min{INT_MAX};
const char* p = lv.line;
@@ -24,19 +45,23 @@ int diff(line_view lv) {
max = d;
if (d < min)
min = d;
+ v.push_back(d);
}
p++;
}
return max - min;
}
-int day2(line_view file) {
- int sum{0};
- per_line(file, [&sum](line_view lv) {
- sum += diff(lv);
+std::pair<int, int> day2(line_view file) {
+ int sum1{0};
+ int sum2{0};
+ per_line(file, [&sum1, &sum2](line_view lv) {
+ std::vector<int> v;
+ sum1 += diff(lv, v);
+ sum2 += diff(size_t(0), v);
return true;
});
- return sum;
+ return {sum1, sum2};
}
} // namespace aoc2017