aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/2022/day17/aoc.cpp158
-rw-r--r--src/2022/day17/aoc.h43
2 files changed, 198 insertions, 3 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
diff --git a/src/2022/day17/aoc.h b/src/2022/day17/aoc.h
index d60e69a..1182cc4 100644
--- a/src/2022/day17/aoc.h
+++ b/src/2022/day17/aoc.h
@@ -1,7 +1,48 @@
#include "common.h"
+#include <stdint.h>
#include <vector>
namespace aoc2022 {
+/*
+..####. 00011110 0x1E
+
+...#... 00001000 0x08
+..###.. 00011100 0x1C
+...#... 00001000 0x08
+
+....#.. 00000100 0x04
+....#.. 00000100 0x04
+..###.. 00011100 0x1C
+
+..#.... 00010000 0x10
+..#.... 00010000 0x10
+..#.... 00010000 0x10
+..#.... 00010000 0x10
+
+..##... 00011000 0x18
+..##... 00011000 0x18
+
+####### 01111111 0x7F
+
+....... 00000000 0x00
+....... 00000000 0x00
+....... 00000000 0x00
+*/
+
+enum rock_type {
+ r1,
+ r2,
+ r3,
+ r4,
+ r5,
+ chamber,
+};
+
+struct rock17 {
+ rock_type type;
+ std::vector<uint8_t> rs;
+};
+
std::pair<int, int> day17(line_view);
-}
+} // namespace aoc2022