aboutsummaryrefslogtreecommitdiff
path: root/src/2015/day19/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2015/day19/aoc.cpp')
-rw-r--r--src/2015/day19/aoc.cpp33
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};
}