aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day17/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-09 15:05:48 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-09 15:05:48 +0800
commit616c378c9855a89c92f0e1c572812a5602fac363 (patch)
tree6003ff6fed6b7859e74bdd009967c5b1819b2a47 /src/2022/day17/aoc.cpp
parentb3ca69c9639f41ab234d1a3917b5c83a41577328 (diff)
downloadadvent-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.cpp115
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