aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-03-23 08:48:34 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-03-23 08:48:34 +0800
commitec0f202ae25905739d40a152e05d8393af0b4ea6 (patch)
treea780fa7ea74a5f07bdcdb3696952f099e3b2d286 /src
parent6c4f0e193314b179f9ffb81b00c1b36c69e3e430 (diff)
downloadadvent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.tar.gz
advent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.zip
day19 part2
Diffstat (limited to 'src')
-rw-r--r--src/2015/day19/aoc.cpp6
-rw-r--r--src/2015/day19/aoc.h34
2 files changed, 34 insertions, 6 deletions
diff --git a/src/2015/day19/aoc.cpp b/src/2015/day19/aoc.cpp
index b665871..1fa17aa 100644
--- a/src/2015/day19/aoc.cpp
+++ b/src/2015/day19/aoc.cpp
@@ -2,7 +2,7 @@
namespace aoc2015 {
-int day19(line_view file) {
+std::pair<int, int> day19(line_view file) {
molecule m;
per_line(file, [&m](line_view lv) {
m.parse(lv);
@@ -10,7 +10,9 @@ int day19(line_view file) {
});
std::map<int, std::vector<molecule::change>> changes;
m.check(changes);
- return m.distinct(changes);
+ int shortest = INT32_MAX;
+ m.deduct(m.original, 0, &shortest);
+ return {m.distinct(changes), shortest};
}
} // namespace aoc2015
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