diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-03-23 08:48:34 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-03-23 08:48:34 +0800 |
commit | ec0f202ae25905739d40a152e05d8393af0b4ea6 (patch) | |
tree | a780fa7ea74a5f07bdcdb3696952f099e3b2d286 /src | |
parent | 6c4f0e193314b179f9ffb81b00c1b36c69e3e430 (diff) | |
download | advent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.tar.gz advent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.zip |
day19 part2
Diffstat (limited to 'src')
-rw-r--r-- | src/2015/day19/aoc.cpp | 6 | ||||
-rw-r--r-- | src/2015/day19/aoc.h | 34 |
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 |