diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-18 21:58:58 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-18 21:58:58 +0800 |
commit | 0ef81936a3d4925db0d1e809a946153b33e65343 (patch) | |
tree | 76f4feb25560b39211ebcf8e3120163007e40dd6 /src/2017/day7/aoc.cpp | |
parent | 62889a8bdaa1fa0cd5f9a412d8171f212b4e1368 (diff) | |
download | advent-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.cpp | 53 |
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 |