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 | |
parent | 6c4f0e193314b179f9ffb81b00c1b36c69e3e430 (diff) | |
download | advent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.tar.gz advent-of-code-ec0f202ae25905739d40a152e05d8393af0b4ea6.zip |
day19 part2
-rw-r--r-- | src/2015/day19/aoc.cpp | 6 | ||||
-rw-r--r-- | src/2015/day19/aoc.h | 34 | ||||
-rw-r--r-- | test/test_2015.cpp | 8 |
3 files changed, 39 insertions, 9 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 diff --git a/test/test_2015.cpp b/test/test_2015.cpp index 12afca7..5906826 100644 --- a/test/test_2015.cpp +++ b/test/test_2015.cpp @@ -201,7 +201,9 @@ TEST_CASE("Like a GIF For Your Yard", "[day18]") { } TEST_CASE("Medicine for Rudolph", "[day19]") { - line_view lv = load_file("../src/2015/day19/input"); - // line_view lv = line_view{"H => HO\nH => OH\nO => HH\n\nHOH\n"}; - REQUIRE(509 == aoc2015::day19(lv)); + // line_view lv = load_file("../src/2015/day19/input"); + line_view lv = line_view{"e => H\ne => O\nH => HO\nH => OH\nO => HH\n\nHOHOHO\n"}; + auto p = aoc2015::day19(lv); + // REQUIRE(509 == p.first); + REQUIRE(0 == p.second); } |