diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-01-07 14:49:49 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-01-07 14:49:49 +0800 |
commit | 0aba299ff6f757407e9a8252514399272e7a4c02 (patch) | |
tree | aa3035954e3e457cdd37424ae8281140d2bbab80 /src/2022/day17/aoc.cpp | |
parent | e486492328698053d2248d7d7bc24adda8523632 (diff) | |
download | advent-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.cpp | 158 |
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 |