diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-01-09 15:05:48 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-01-09 15:05:48 +0800 |
commit | 616c378c9855a89c92f0e1c572812a5602fac363 (patch) | |
tree | 6003ff6fed6b7859e74bdd009967c5b1819b2a47 /src/2022/day17/aoc.cpp | |
parent | b3ca69c9639f41ab234d1a3917b5c83a41577328 (diff) | |
download | advent-of-code-616c378c9855a89c92f0e1c572812a5602fac363.tar.gz advent-of-code-616c378c9855a89c92f0e1c572812a5602fac363.zip |
2022 day17 part1
Diffstat (limited to 'src/2022/day17/aoc.cpp')
-rw-r--r-- | src/2022/day17/aoc.cpp | 115 |
1 files changed, 54 insertions, 61 deletions
diff --git a/src/2022/day17/aoc.cpp b/src/2022/day17/aoc.cpp index 28a171f..c9d0dca 100644 --- a/src/2022/day17/aoc.cpp +++ b/src/2022/day17/aoc.cpp @@ -1,4 +1,5 @@ #include "aoc.h" +#include <map> namespace aoc2022 { @@ -16,13 +17,14 @@ char next() { static int i{0}; int x = i++ % (moves.length - 1); const char* p = moves.line; - printf("%c at %d\n", *(p + x), x); + // printf("%c at %d\n", *(p + x), x); return *(p + x); } void print(std::vector<uint8_t>& rs) { for (size_t i = rs.size(); i > 0; i--) { uint8_t x = rs[i - 1]; + printf("%05ld| ", i - 1); int c{6}; while (c >= 0) { printf("%c", at(x, c) ? '#' : '.'); @@ -32,7 +34,7 @@ void print(std::vector<uint8_t>& rs) { } } -rock17 make_rock(int i) { +rock17 make_rock(size_t i) { rock17 r; r.type = (rock_type)(i % 5); switch (r.type) { @@ -66,59 +68,15 @@ rock17 make_rock(int i) { } rock17 right(rock17 r) { - switch (r.type) { - case r1: - r.rs[0] >>= 1; - break; - case r2: - case r3: - r.rs[0] >>= 1; - r.rs[1] >>= 1; - r.rs[2] >>= 1; - break; - case r4: - r.rs[0] >>= 1; - r.rs[1] >>= 1; - r.rs[2] >>= 1; - r.rs[3] >>= 1; - break; - case r5: - r.rs[0] >>= 1; - r.rs[1] >>= 1; - break; - default: - break; + for (auto& rx : r.rs) { + rx >>= 1; } return r; } rock17 left(rock17 r) { - switch (r.type) { - case r1: - r.rs[0] <<= 1; - break; - case r2: - r.rs[0] <<= 1; - r.rs[1] <<= 1; - r.rs[2] <<= 1; - break; - case r3: - r.rs[0] <<= 1; - r.rs[1] <<= 1; - r.rs[2] <<= 1; - break; - case r4: - r.rs[0] <<= 1; - r.rs[1] <<= 1; - r.rs[2] <<= 1; - r.rs[3] <<= 1; - break; - case r5: - r.rs[0] <<= 1; - r.rs[1] <<= 1; - break; - default: - break; + for (auto& rx : r.rs) { + rx <<= 1; } return r; } @@ -128,8 +86,14 @@ bool collide(uint8_t r1, uint8_t r2) { return r1 & r2; } bool collide_left(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2) { for (size_t j = 0; j < rs1.size(); j++) { for (int i = 6; i >= 0; i--) { - if (at(rs1[j], i) && (i == 6 || at(rs2[j + 1], i + 1))) { - return true; + if (at(rs1[j], i)) { + if (i == 6) + return true; + if (at(rs2[j + 1], i + 1)) { + return true; + } else { + break; + } } } } @@ -139,15 +103,27 @@ bool collide_left(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2) { bool collide_right(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2) { for (size_t j = 0; j < rs1.size(); j++) { for (int i = 0; i <= 6; i++) { - if (at(rs1[j], i) && (i == 0 || at(rs2[j + 1], i - 1))) { - return true; + if (at(rs1[j], i)) { + if (i == 0) + return true; + if (at(rs2[j + 1], i - 1)) { + return true; + } else { + break; + } } } } return false; } -bool collide_down(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2) { return collide(rs1[0], rs2[0]); } +bool collide_down(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2) { + for (size_t i = 0; i < rs1.size(); i++) { + if (collide(rs1[i], rs2[i])) + return true; + } + return false; +} void merge(rock17& floor, rock17 r, int n) { std::vector<uint8_t> room; @@ -185,7 +161,14 @@ void merge(rock17& floor, rock17 r, int n) { } } -void check_three(std::vector<uint8_t>& rs) { +int merge(std::vector<uint8_t>& rs1, std::vector<uint8_t>& rs2, int n) { + if (collide(rs1[rs1.size() - 1 - n], rs2[0])) + return n; + else + return merge(rs1, rs2, n + 1); +} + +int check_three(std::vector<uint8_t>& rs) { auto n = 0; while (rs[rs.size() - n - 1] == 0x00) { n++; @@ -195,21 +178,31 @@ void check_three(std::vector<uint8_t>& rs) { while (needed-- > 0) { rs.push_back(0x00); } + return n; } -std::pair<int, int> day17(line_view file) { +std::vector<uint8_t> get_pattern(rock17& r) { + auto n = 0; + while (r.rs[r.rs.size() - n - 1] == 0x00) { + n++; + } + return {r.rs.begin() + 1, r.rs.end() - n}; +} + +std::pair<size_t, size_t> day17(line_view file) { moves = file; rock17 floor{chamber, {0x7F}}; + std::map<size_t, size_t> heights; - int n{10}; - for (int i = 0; i < n; i++) { + // size_t n = (file.length - 1) * 5; + size_t n = 2022; + for (size_t i = 0; i < n; i++) { rock17 r = make_rock(i); check_three(floor.rs); merge(floor, r, 0); } print(floor.rs); - printf("%ld\n", floor.rs.size() - 4); - + printf("%ld\n", floor.rs.size() - 1); return {0, 0}; } } // namespace aoc2022 |