diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-03-27 12:08:53 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-03-27 12:08:53 +0800 |
commit | 6dcf2ca56136c76dd3e72553791db9df5e10a585 (patch) | |
tree | bc87dc5f9919c1d9075587128d4471badd06e107 /src/2015 | |
parent | f01ca26994a0787a8f874bfbe82c4bf0d646dbbc (diff) | |
download | advent-of-code-6dcf2ca56136c76dd3e72553791db9df5e10a585.tar.gz advent-of-code-6dcf2ca56136c76dd3e72553791db9df5e10a585.zip |
day19 done, the ugliest code ever written
Diffstat (limited to 'src/2015')
-rw-r--r-- | src/2015/day19/aoc.cpp | 20 | ||||
-rw-r--r-- | src/2015/day19/aoc.h | 10 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/2015/day19/aoc.cpp b/src/2015/day19/aoc.cpp index 019a120..68f5f52 100644 --- a/src/2015/day19/aoc.cpp +++ b/src/2015/day19/aoc.cpp @@ -16,16 +16,20 @@ std::pair<int, int> day19(line_view file) { int steps = 0; line_view lv = m.original; + std::vector<molecule::pattern> ps; do { lv = m.replace(lv, &steps); - printf("%d\n", steps); + // printf("%d\n", steps); - std::vector<molecule::pattern> ps; + ps.clear(); const char* x = nullptr; m.parse_pattern(lv, 0, ps, &x); - std::for_each(ps.begin(), ps.end(), - [](molecule::pattern p) { std::cout << p.depth << " -> " << p.lv << std::endl; }); + // std::for_each(ps.begin(), ps.end(), + // [](molecule::pattern p) { std::cout << p.depth << " -> " << p.lv << std::endl; }); + if (ps[0].lv == "e") { + break; + } if (ps[0].lv.contains("Y")) { std::vector<line_view> ys; m.parse_y(ps[0].lv, ys); @@ -38,11 +42,15 @@ std::pair<int, int> day19(line_view file) { } } else { line_view to = m.deduce(ps[0].lv, &steps); - lv = m.replace(lv, {ps[0].lv, to}, ps[0].lv.line); + if (!(to == ps[0].lv)) { + lv = m.replace(lv, {ps[0].lv, to}, ps[0].lv.line); + } else { + lv = m.deduce(lv, ps[0].lv.line - 2, &steps); + } } } while (true); - return {m.distinct(changes), 0}; + return {m.distinct(changes), steps}; } } // namespace aoc2015 diff --git a/src/2015/day19/aoc.h b/src/2015/day19/aoc.h index af2c720..deb184b 100644 --- a/src/2015/day19/aoc.h +++ b/src/2015/day19/aoc.h @@ -81,6 +81,16 @@ struct molecule { return lv; } + line_view deduce(line_view lv, const char* p, int* step) { + const char* p1 = p; + do { + p--; + } while (backwards.find({p, p1}) == backwards.end()); + auto it = backwards.find({p, p1}); + *step += 1; + return replace(lv, {it->first, it->second}, p); + } + void parse_y(line_view lv, std::vector<line_view>& ys) { const char* p1 = lv.line; const char* p2 = lv.line + lv.length; |