aboutsummaryrefslogtreecommitdiff
path: root/src/2015/day19/aoc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/2015/day19/aoc.h')
-rw-r--r--src/2015/day19/aoc.h34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/2015/day19/aoc.h b/src/2015/day19/aoc.h
index 39fa7a5..f763f15 100644
--- a/src/2015/day19/aoc.h
+++ b/src/2015/day19/aoc.h
@@ -90,14 +90,40 @@ struct molecule {
return d;
}
- line_view replace(line_view lv, const replacement& r, const char* p) const noexcept { return {}; }
+ // r.to -> r.from at p
+ line_view replace(line_view lv, const replacement& r, const char* p) const noexcept {
+ size_t len = lv.length + r.from.length - r.to.length;
+ char* s = (char*)malloc(len);
+ memset(s, 0x0, len);
+ const char* ps[] = {lv.line, p, p + r.to.length, lv.line + lv.length};
+ char* x = s;
+ for (size_t i = 0; i < 3; i++) {
+ if (i != 1) {
+ const char* p1 = ps[i];
+ const char* p2 = ps[i + 1];
+ // std::cout << line_view{p1, p2} << std::endl;
+ memcpy(x, p1, p2 - p1);
+ x += (p2 - p1);
+ } else {
+ const char* p1 = r.from.line;
+ const char* p2 = r.from.line + r.from.length;
+ // std::cout << line_view{p1, p2} << std::endl;
+ memcpy(x, p1, p2 - p1);
+ x += (p2 - p1);
+ }
+ }
+ return {s, len};
+ }
void deduct(line_view lv, int steps, int* shortest) const noexcept {
+ std::cout << lv << " " << steps << std::endl;
if (lv == "e") {
if (*shortest > steps) {
*shortest = steps;
}
- } else {
+ return;
+ }
+ if (lv.length > 1) {
const char* p1 = lv.line;
const char* p2 = lv.line + lv.length;
for (auto& r : replacements) {
@@ -126,8 +152,8 @@ struct molecule {
}
}
}
-};
+}; // namespace aoc2015
-int day19(line_view);
+std::pair<int, int> day19(line_view);
} // namespace aoc2015