aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day7/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-18 21:58:58 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-18 21:58:58 +0800
commit0ef81936a3d4925db0d1e809a946153b33e65343 (patch)
tree76f4feb25560b39211ebcf8e3120163007e40dd6 /src/2017/day7/aoc.cpp
parent62889a8bdaa1fa0cd5f9a412d8171f212b4e1368 (diff)
downloadadvent-of-code-0ef81936a3d4925db0d1e809a946153b33e65343.tar.gz
advent-of-code-0ef81936a3d4925db0d1e809a946153b33e65343.zip
2017 day7 part1
Diffstat (limited to 'src/2017/day7/aoc.cpp')
-rw-r--r--src/2017/day7/aoc.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/2017/day7/aoc.cpp b/src/2017/day7/aoc.cpp
index fe3ee2f..86e2e45 100644
--- a/src/2017/day7/aoc.cpp
+++ b/src/2017/day7/aoc.cpp
@@ -1,4 +1,57 @@
#include "aoc.h"
+#include <unordered_map>
namespace aoc2017 {
+
+void fix_subs(std::unordered_map<line_view, disc*>& ds) {
+ for (auto& kv : ds) {
+ if (kv.second->xp != nullptr) {
+ const char* p1 = kv.second->xp;
+ const char* p = p1;
+ while (*p != '\n') {
+ if (*p == ',') {
+ kv.second->subs.push_back(ds[{p1, p}]);
+ p1 = p + 2;
+ }
+ p++;
+ }
+ kv.second->subs.push_back(ds[{p1, p}]);
+ }
+ }
+}
+
+void depth(disc* d, int* dh) {
+ if (d->subs.size() > 0) {
+ *dh += 1;
+ depth(d->subs[0], dh);
+ }
}
+
+void day7(line_view file, char name[]) {
+ std::unordered_map<line_view, disc*> ds;
+ per_line(file, [&ds](line_view lv) {
+ const char* p = lv.contains("(");
+ line_view name{lv.line, p - 1};
+ ds.insert({name, new disc{lv, p}});
+ return true;
+ });
+ fix_subs(ds);
+
+ line_view x;
+ int max{INT32_MIN};
+ for (auto& kv : ds) {
+ int d{1};
+ depth(kv.second, &d);
+ if (d > max) {
+ max = d;
+ x = kv.first;
+ }
+ }
+ int i{0};
+ per_char(x, [&name, &i](char c) {
+ name[i++] = c;
+ return true;
+ });
+}
+
+} // namespace aoc2017