aboutsummaryrefslogtreecommitdiff
path: root/src/2015
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-03-27 12:08:53 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-03-27 12:08:53 +0800
commit6dcf2ca56136c76dd3e72553791db9df5e10a585 (patch)
treebc87dc5f9919c1d9075587128d4471badd06e107 /src/2015
parentf01ca26994a0787a8f874bfbe82c4bf0d646dbbc (diff)
downloadadvent-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.cpp20
-rw-r--r--src/2015/day19/aoc.h10
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;