diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-01-07 15:52:44 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-01-07 15:52:44 +0800 |
commit | 83c8d504b055b278ef05f5726455e512a46efdae (patch) | |
tree | 4750e1afc11bbec7cd33f8a55515254385201c7a /src/2022/day17/aoc.cpp | |
parent | 0aba299ff6f757407e9a8252514399272e7a4c02 (diff) | |
download | advent-of-code-83c8d504b055b278ef05f5726455e512a46efdae.tar.gz advent-of-code-83c8d504b055b278ef05f5726455e512a46efdae.zip |
2022 day17 merge
Diffstat (limited to 'src/2022/day17/aoc.cpp')
-rw-r--r-- | src/2022/day17/aoc.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/2022/day17/aoc.cpp b/src/2022/day17/aoc.cpp index 538dc8f..d7a1099 100644 --- a/src/2022/day17/aoc.cpp +++ b/src/2022/day17/aoc.cpp @@ -16,8 +16,7 @@ char next() { static int i{0}; i %= (moves.length - 1); const char* p = moves.line; - i++; - return *(p + i); + return *(p + i++); } void print(const rock17& r) { @@ -141,20 +140,43 @@ rock17 left(rock17 r) { return r; } -void merge(rock17& floor, rock17 r) {} +bool collide(uint8_t r1, uint8_t r2) { return r1 & r2; } + +void merge(rock17& floor, rock17 r, int n) { + auto m = next(); + printf("%c %d\n", m, r.type); + r = m == '>' ? right(r) : left(r); + + uint8_t rt = floor.rs[floor.rs.size() - 1 - n]; + uint8_t rh = r.rs[0]; + if (!collide(rt, rh)) { + merge(floor, r, n + 1); + } else { // merge from n to last with r + size_t m{0}; + // 1. merge + for (size_t i = floor.rs.size() - n; m < r.rs.size() && i < floor.rs.size(); i++) { + floor.rs[i] |= r.rs[m]; + m++; + } + // 2. push if necessary + while (m < r.rs.size()) { + floor.rs.push_back(r.rs[m++]); + } + } +} std::pair<int, int> day17(line_view file) { moves = file; rock17 floor{chamber, {0x7F}}; - int n{10}; + int n{3}; for (int i = 0; i < n; i++) { rock17 r = make_rock(i); auto three{3}; while (three-- > 0) { floor.rs.push_back(0x00); } - merge(floor, r); + merge(floor, r, 0); } print(floor); |