diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-03-25 23:26:04 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-03-25 23:26:04 +0800 |
commit | daf739fbead15378ae7341076570658b92dfef6a (patch) | |
tree | aad54205905c8366522011a1effafa1bdfc94e67 /src/2015 | |
parent | 44f63ae43ba08394cc0ff374ace5a707aa3c08bf (diff) | |
download | advent-of-code-daf739fbead15378ae7341076570658b92dfef6a.tar.gz advent-of-code-daf739fbead15378ae7341076570658b92dfef6a.zip |
day19 parse pattern
Diffstat (limited to 'src/2015')
-rw-r--r-- | src/2015/day19/aoc.cpp | 10 | ||||
-rw-r--r-- | src/2015/day19/aoc.h | 26 |
2 files changed, 20 insertions, 16 deletions
diff --git a/src/2015/day19/aoc.cpp b/src/2015/day19/aoc.cpp index 0d69022..af42b23 100644 --- a/src/2015/day19/aoc.cpp +++ b/src/2015/day19/aoc.cpp @@ -10,10 +10,14 @@ std::pair<int, int> day19(line_view file) { }); std::map<int, std::vector<molecule::change>> changes; m.check(changes); - int shortest = INT32_MAX; + // int shortest = INT32_MAX; // m.deduct(m.original, 0, &shortest); - m.transfer("e", 0, &shortest); - return {m.distinct(changes), shortest}; + // m.transfer("e", 0, &shortest); + std::vector<molecule::pattern> ps; + const char* x = nullptr; + m.parse_pattern(m.original, 0, ps, &x); + std::for_each(ps.begin(), ps.end(), [](molecule::pattern p) { std::cout << p.depth << " -> " << p.lv << std::endl; }); + return {m.distinct(changes), 0}; } } // namespace aoc2015 diff --git a/src/2015/day19/aoc.h b/src/2015/day19/aoc.h index 62b4785..1fd4624 100644 --- a/src/2015/day19/aoc.h +++ b/src/2015/day19/aoc.h @@ -24,30 +24,30 @@ struct molecule { replacement c; }; - //...Rn.Y.Y.Ar - const char* parse_pattern(line_view lv, std::vector<line_view>& ps) { + struct pattern { + int depth; + line_view lv; + }; + + //...Rn..Ar + void parse_pattern(line_view lv, int depth, std::vector<pattern>& ps, const char** a) { const char* p1 = lv.line; const char* p2 = lv.line + lv.length; const char* p = p1; while (p < p2) { if (*p == 'R') { - const char* a = parse_pattern({p+2, p2}, ps); - p = a + 2; + parse_pattern({p + 2, p2}, depth + 1, ps, a); + p = *a + 2; continue; } if (*p == 'A' && *(p + 1) == 'r') { - ps.push_back({p1, p}); - return p; - } - if (*p == 'Y') { - ps.push_back({p1, p}); - p++; - p1 = p; - continue; + ps.push_back({depth, {p1, p}}); + *a = p; + return; } p++; } - return nullptr; + ps.push_back({depth, {p1, p}}); } void check(size_t i, replacement r, std::map<int, std::vector<change>>& vr) const noexcept { |