diff options
Diffstat (limited to 'src/2015/day19/aoc.cpp')
-rw-r--r-- | src/2015/day19/aoc.cpp | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/2015/day19/aoc.cpp b/src/2015/day19/aoc.cpp index af42b23..019a120 100644 --- a/src/2015/day19/aoc.cpp +++ b/src/2015/day19/aoc.cpp @@ -13,10 +13,35 @@ std::pair<int, int> day19(line_view file) { // int shortest = INT32_MAX; // m.deduct(m.original, 0, &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; }); + int steps = 0; + + line_view lv = m.original; + + do { + lv = m.replace(lv, &steps); + printf("%d\n", steps); + + std::vector<molecule::pattern> ps; + 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; }); + if (ps[0].lv.contains("Y")) { + std::vector<line_view> ys; + m.parse_y(ps[0].lv, ys); + for (auto y : ys) { + if (m.transfers.find(y) == m.transfers.end()) { + line_view to = m.deduce(y, &steps); + lv = m.replace(lv, {y, to}, y.line); + break; + } + } + } else { + line_view to = m.deduce(ps[0].lv, &steps); + lv = m.replace(lv, {ps[0].lv, to}, ps[0].lv.line); + } + } while (true); + return {m.distinct(changes), 0}; } |