aboutsummaryrefslogtreecommitdiff
path: root/src/2021/day1/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-04 18:57:16 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-04 18:57:16 +0800
commit770404cb5d2a65787dd612396dfd8248d20e61dc (patch)
tree0d1c760a6b09844d0112d8d3a04febe689d2e0b1 /src/2021/day1/aoc.cpp
parentd3c489ff893b852f656c69e2c9e727bab35c4b8f (diff)
downloadadvent-of-code-770404cb5d2a65787dd612396dfd8248d20e61dc.tar.gz
advent-of-code-770404cb5d2a65787dd612396dfd8248d20e61dc.zip
2021 day1
Diffstat (limited to 'src/2021/day1/aoc.cpp')
-rw-r--r--src/2021/day1/aoc.cpp49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/2021/day1/aoc.cpp b/src/2021/day1/aoc.cpp
index 5f8b1ce..2abe76e 100644
--- a/src/2021/day1/aoc.cpp
+++ b/src/2021/day1/aoc.cpp
@@ -1,3 +1,50 @@
#include "aoc.h"
+#include <algorithm>
+#include <vector>
-namespace aoc2021 {}
+namespace aoc2021 {
+
+int get_number(const char* p) {
+ int d{0};
+ while (*p >= '0' && *p <= '9') {
+ d = d * 10 + *p - '0';
+ p++;
+ }
+ return d;
+}
+
+int increase_1(const std::vector<int>& is) {
+ int total{0};
+ int last{0};
+ std::for_each(is.begin(), is.end(), [&total, &last](int d) {
+ total += (last != 0 && d > last) ? 1 : 0;
+ last = d;
+ return true;
+ });
+ return total;
+}
+
+int increase_3(const std::vector<int>& is) {
+ int total{0};
+ auto sum3 = [](const int* is) { return *is + *(is + 1) + *(is + 2); };
+ const int* p1 = is.data();
+ const int* p2 = p1 + is.size() - 3;
+ while (p1 < p2) {
+ if (sum3(p1 + 1) > sum3(p1)) {
+ total += 1;
+ }
+ p1++;
+ }
+ return total;
+}
+
+std::pair<int, int> day1(line_view file) {
+ std::vector<int> is;
+ per_line(file, [&is](line_view lv) {
+ is.emplace_back(get_number(lv.line));
+ return true;
+ });
+ return {increase_1(is), increase_3(is)};
+}
+
+} // namespace aoc2021