aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day17/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-07 15:52:44 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-07 15:52:44 +0800
commit83c8d504b055b278ef05f5726455e512a46efdae (patch)
tree4750e1afc11bbec7cd33f8a55515254385201c7a /src/2022/day17/aoc.cpp
parent0aba299ff6f757407e9a8252514399272e7a4c02 (diff)
downloadadvent-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.cpp32
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);