aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day17/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-07 14:49:49 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-07 14:49:49 +0800
commit0aba299ff6f757407e9a8252514399272e7a4c02 (patch)
treeaa3035954e3e457cdd37424ae8281140d2bbab80 /src/2022/day17/aoc.cpp
parente486492328698053d2248d7d7bc24adda8523632 (diff)
downloadadvent-of-code-0aba299ff6f757407e9a8252514399272e7a4c02.tar.gz
advent-of-code-0aba299ff6f757407e9a8252514399272e7a4c02.zip
2022 day17 part1
Diffstat (limited to 'src/2022/day17/aoc.cpp')
-rw-r--r--src/2022/day17/aoc.cpp158
1 files changed, 156 insertions, 2 deletions
diff --git a/src/2022/day17/aoc.cpp b/src/2022/day17/aoc.cpp
index c35000b..538dc8f 100644
--- a/src/2022/day17/aoc.cpp
+++ b/src/2022/day17/aoc.cpp
@@ -2,8 +2,162 @@
namespace aoc2022 {
-std::pair<int, int> day17(line_view) {
- return {0, 0};
+static line_view moves;
+
+static uint8_t at(uint8_t r, int p) {
+ // p 0..7
+ uint8_t m = 0x01;
+ while (p-- > 0)
+ m <<= 1;
+ return m & r;
+}
+
+char next() {
+ static int i{0};
+ i %= (moves.length - 1);
+ const char* p = moves.line;
+ i++;
+ return *(p + i);
+}
+
+void print(const rock17& r) {
+ for (size_t i = r.rs.size(); i > 0; i--) {
+ uint8_t x = r.rs[i - 1];
+ int c{6};
+ while (c >= 0) {
+ printf("%c", at(x, c) ? '#' : '.');
+ c--;
+ }
+ printf("\n");
+ }
+}
+
+rock17 make_rock(int i) {
+ rock17 r;
+ r.type = (rock_type)(i % 5);
+ switch (r.type) {
+ case r1:
+ r.rs = {0x1E};
+ break;
+ case r2:
+ r.rs = {0x08, 0x1C, 0x08};
+ break;
+ case r3:
+ r.rs = {0x1C, 0x04, 0x04};
+ break;
+ case r4:
+ r.rs = {0x10, 0x10, 0x10, 0x10};
+ break;
+ case r5:
+ r.rs = {0x18, 0x18};
+ break;
+ default:
+ break;
+ }
+ /*
+ case chamber:
+ r.rs = {0x7F};
+ break;
+ case three:
+ r.rs = {0x00, 0x00, 0x00};
+ break;
+ */
+ return r;
}
+
+rock17 right(rock17 r) {
+ switch (r.type) {
+ case r1:
+ if (at(r.rs[0], 0) == 0) {
+ r.rs[0] >>= 1;
+ }
+ break;
+ case r2:
+ case r3:
+ if (at(r.rs[1], 0) == 0) {
+ r.rs[0] >>= 1;
+ r.rs[1] >>= 1;
+ r.rs[2] >>= 1;
+ }
+ break;
+ case r4:
+ if (at(r.rs[0], 0) == 0) {
+ r.rs[0] >>= 1;
+ r.rs[1] >>= 1;
+ r.rs[2] >>= 1;
+ r.rs[3] >>= 1;
+ }
+ break;
+ case r5:
+ if (at(r.rs[0], 0) == 0) {
+ r.rs[0] >>= 1;
+ r.rs[1] >>= 1;
+ }
+ break;
+ default:
+ break;
+ }
+ return r;
+}
+
+rock17 left(rock17 r) {
+ switch (r.type) {
+ case r1:
+ if (at(r.rs[0], 6) == 0) {
+ r.rs[0] <<= 1;
+ }
+ break;
+ case r2:
+ if (at(r.rs[1], 6) == 0) {
+ r.rs[0] <<= 1;
+ r.rs[1] <<= 1;
+ r.rs[2] <<= 1;
+ }
+ break;
+ case r3:
+ if (at(r.rs[0], 6) == 0) {
+ r.rs[0] <<= 1;
+ r.rs[1] <<= 1;
+ r.rs[2] <<= 1;
+ }
+ break;
+ case r4:
+ if (at(r.rs[0], 6) == 0) {
+ r.rs[0] <<= 1;
+ r.rs[1] <<= 1;
+ r.rs[2] <<= 1;
+ r.rs[3] <<= 1;
+ }
+ break;
+ case r5:
+ if (at(r.rs[0], 6) == 0) {
+ r.rs[0] <<= 1;
+ r.rs[1] <<= 1;
+ }
+ break;
+ default:
+ break;
+ }
+ return r;
}
+void merge(rock17& floor, rock17 r) {}
+
+std::pair<int, int> day17(line_view file) {
+ moves = file;
+ rock17 floor{chamber, {0x7F}};
+
+ int n{10};
+ 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);
+ }
+
+ print(floor);
+ return {0, 0};
+}
+} // namespace aoc2022