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 | |
parent | e486492328698053d2248d7d7bc24adda8523632 (diff) | |
download | advent-of-code-0aba299ff6f757407e9a8252514399272e7a4c02.tar.gz advent-of-code-0aba299ff6f757407e9a8252514399272e7a4c02.zip |
2022 day17 part1
-rw-r--r-- | src/2022/day17/aoc.cpp | 158 | ||||
-rw-r--r-- | src/2022/day17/aoc.h | 43 |
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 |