diff options
-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); |