aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day22/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2022/day22/aoc.cpp')
-rw-r--r--src/2022/day22/aoc.cpp199
1 files changed, 149 insertions, 50 deletions
diff --git a/src/2022/day22/aoc.cpp b/src/2022/day22/aoc.cpp
index eee9ad7..a6e953c 100644
--- a/src/2022/day22/aoc.cpp
+++ b/src/2022/day22/aoc.cpp
@@ -12,26 +12,20 @@ struct person {
facing f;
};
-static int absolute_x(int x, const monkey_map& r) {
- return r.start + x;
-}
+static int absolute_x(int x, const monkey_map& r) { return r.start + x; }
typedef int (*yf)(int, const std::vector<monkey_map>&);
-int prev_y(int y, const std::vector<monkey_map>& ms) {
- return y == 0 ? ms.size() - 1 : y - 1;
-}
+int prev_y(int y, const std::vector<monkey_map>& ms) { return y == 0 ? ms.size() - 1 : y - 1; }
-int next_y(int y, const std::vector<monkey_map>& ms) {
- return y == (int) ms.size() - 1 ? 0 : y + 1;
-}
+int next_y(int y, const std::vector<monkey_map>& ms) { return y == (int)ms.size() - 1 ? 0 : y + 1; }
int find_next(int x, int y, const std::vector<monkey_map>& ms, yf f) {
auto ax = absolute_x(x, ms[y]);
while (true) {
y = f(y, ms);
const monkey_map& r = ms[y];
- if (ax >= r.start && ax < r.start + (int) r.line.length) {
+ if (ax >= r.start && ax < r.start + (int)r.line.length) {
return y;
}
}
@@ -87,7 +81,7 @@ void go_right(int s, person* p, const std::vector<monkey_map>& ms) {
if (s > 0) {
const monkey_map& m = ms[p->y];
mark(m.start + p->x, p->y, '>');
- int x = p->x + 1 < (int) m.line.length ? p->x + 1 : 0;
+ int x = p->x + 1 < (int)m.line.length ? p->x + 1 : 0;
char c = *(m.line.line + x);
if (c == '.') {
p->x = x;
@@ -120,96 +114,201 @@ void travel(person* p, const std::vector<monkey_map>& ms, const route& r) {
}
}
-std::pair<int64_t, int64_t> day22(line_view file) {
- per_line(file, [](line_view lv) {
- const char* p = lv.line;
- if (*p == ' ' || *p == '.' || *p == '#') {
- maps.emplace_back(p);
- }
- if (*p >= '0' && *p <= '9') {
- facing f = right;
- while (*p != '\n') {
- routes.emplace_back(&p, &f);
- }
- }
- return true;
- });
-
- for(auto&m : maps) {
- tmaps.emplace_back(m);
- }
-
- cube_map cubs[6];
- // sample
+void cube_sample(cube_map cubs[6]) {
// R2L
// D3U 1 R6L
// L4R
cubs[0].x = 2 * cube_map::size;
cubs[0].y = 0;
+ cubs[0].sides[facing::up].m = &cubs[1];
+ cubs[0].sides[facing::up].f = facing::down;
+ cubs[0].sides[facing::left].m = &cubs[2];
+ cubs[0].sides[facing::left].f = facing::down;
cubs[0].sides[facing::right].m = &cubs[5];
cubs[0].sides[facing::right].f = facing::left;
cubs[0].sides[facing::down].m = &cubs[3];
cubs[0].sides[facing::down].f = facing::down;
- cubs[0].sides[facing::left].m = &cubs[2];
- cubs[0].sides[facing::left].f = facing::down;
- cubs[0].sides[facing::up].m = &cubs[1];
- cubs[0].sides[facing::up].f = facing::down;
// R1L
// U6D 2 L3R
// R5L
cubs[1].x = 0;
cubs[1].y = cube_map::size;
+ cubs[1].sides[facing::up].m = &cubs[0];
+ cubs[1].sides[facing::up].f = facing::down;
+ cubs[1].sides[facing::left].m = &cubs[5];
+ cubs[1].sides[facing::left].f = facing::up;
cubs[1].sides[facing::right].m = &cubs[2];
cubs[1].sides[facing::right].f = facing::right;
cubs[1].sides[facing::down].m = &cubs[4];
cubs[1].sides[facing::down].f = facing::up;
- cubs[1].sides[facing::left].m = &cubs[5];
- cubs[1].sides[facing::left].f = facing::up;
- cubs[1].sides[facing::up].m = &cubs[0];
- cubs[1].sides[facing::up].f = facing::down;
// U1D
// L2R 3 L4R
// D5U
+ cubs[2].x = cube_map::size;
+ cubs[2].y = cube_map::size;
+ cubs[2].sides[facing::up].m = &cubs[0];
+ cubs[2].sides[facing::up].f = facing::right;
+ cubs[2].sides[facing::left].m = &cubs[1];
+ cubs[2].sides[facing::left].f = facing::left;
+ cubs[2].sides[facing::right].m = &cubs[3];
+ cubs[2].sides[facing::right].f = facing::right;
+ cubs[2].sides[facing::down].m = &cubs[4];
+ cubs[2].sides[facing::down].f = facing::right;
// L1R
// L3R 4 U6D
// L5R
-
+ cubs[3].x = 2 * cube_map::size;
+ cubs[3].y = cube_map::size;
+ cubs[3].sides[facing::up].m = &cubs[0];
+ cubs[3].sides[facing::up].f = facing::up;
+ cubs[3].sides[facing::left].m = &cubs[2];
+ cubs[3].sides[facing::left].f = facing::down;
+ cubs[3].sides[facing::right].m = &cubs[5];
+ cubs[3].sides[facing::right].f = facing::left;
+ cubs[3].sides[facing::down].m = &cubs[4];
+ cubs[3].sides[facing::down].f = facing::down;
+
// L4R
// U3D 5 L6R
// R2L
+ cubs[4].x = 2 * cube_map::size;
+ cubs[4].y = 2 * cube_map::size;
+ cubs[4].sides[facing::up].m = &cubs[3];
+ cubs[4].sides[facing::up].f = facing::up;
+ cubs[4].sides[facing::left].m = &cubs[2];
+ cubs[4].sides[facing::left].f = facing::up;
+ cubs[4].sides[facing::right].m = &cubs[5];
+ cubs[4].sides[facing::right].f = facing::right;
+ cubs[4].sides[facing::down].m = &cubs[1];
+ cubs[4].sides[facing::down].f = facing::up;
// D4U
// L5R 6 R1L
// D2U
+ cubs[5].x = 3 * cube_map::size;
+ cubs[5].y = 2 * cube_map::size;
+ cubs[5].sides[facing::up].m = &cubs[3];
+ cubs[5].sides[facing::up].f = facing::left;
+ cubs[5].sides[facing::left].m = &cubs[4];
+ cubs[5].sides[facing::left].f = facing::left;
+ cubs[5].sides[facing::right].m = &cubs[0];
+ cubs[5].sides[facing::right].f = facing::left;
+ cubs[5].sides[facing::down].m = &cubs[1];
+ cubs[5].sides[facing::down].f = facing::right;
+}
-
- // input
+void cube_input(cube_map cubs[6]) {
// U6D
// R4L 1 L2R
// L3R
- //
+ cubs[0].x = cube_map::size;
+ cubs[0].y = 0;
+ cubs[0].sides[facing::up].m = &cubs[5];
+ cubs[0].sides[facing::up].f = facing::right;
+ cubs[0].sides[facing::left].m = &cubs[3];
+ cubs[0].sides[facing::left].f = facing::right;
+ cubs[0].sides[facing::right].m = &cubs[1];
+ cubs[0].sides[facing::right].f = facing::right;
+ cubs[0].sides[facing::down].m = &cubs[2];
+ cubs[0].sides[facing::down].f = facing::down;
+
// L6R
// L1R 2 R5L
// U3D
- //
+ cubs[1].x = 2 * cube_map::size;
+ cubs[1].y = 0;
+ cubs[1].sides[facing::up].m = &cubs[5];
+ cubs[1].sides[facing::up].f = facing::up;
+ cubs[1].sides[facing::left].m = &cubs[0];
+ cubs[1].sides[facing::left].f = facing::left;
+ cubs[1].sides[facing::right].m = &cubs[4];
+ cubs[1].sides[facing::right].f = facing::left;
+ cubs[1].sides[facing::down].m = &cubs[2];
+ cubs[1].sides[facing::down].f = facing::left;
+
// L1R
// D4U 3 D2U
// L5R
- //
+ cubs[2].x = cube_map::size;
+ cubs[2].y = cube_map::size;
+ cubs[2].sides[facing::up].m = &cubs[0];
+ cubs[2].sides[facing::up].f = facing::up;
+ cubs[2].sides[facing::left].m = &cubs[3];
+ cubs[2].sides[facing::left].f = facing::down;
+ cubs[2].sides[facing::right].m = &cubs[1];
+ cubs[2].sides[facing::right].f = facing::up;
+ cubs[2].sides[facing::down].m = &cubs[4];
+ cubs[2].sides[facing::down].f = facing::down;
+
// U3D
// R1L 4 L5R
// L6R
- //
+ cubs[3].x = 0;
+ cubs[3].y = 2 * cube_map::size;
+ cubs[3].sides[facing::up].m = &cubs[2];
+ cubs[3].sides[facing::up].f = facing::right;
+ cubs[3].sides[facing::left].m = &cubs[0];
+ cubs[3].sides[facing::left].f = facing::right;
+ cubs[3].sides[facing::right].m = &cubs[4];
+ cubs[3].sides[facing::right].f = facing::right;
+ cubs[3].sides[facing::down].m = &cubs[5];
+ cubs[3].sides[facing::down].f = facing::down;
+
// L3R
// L4R 5 R2L
// U6D
- //
+ cubs[4].x = cube_map::size;
+ cubs[4].y = 2 * cube_map::size;
+ cubs[4].sides[facing::up].m = &cubs[2];
+ cubs[4].sides[facing::up].f = facing::up;
+ cubs[4].sides[facing::left].m = &cubs[3];
+ cubs[4].sides[facing::left].f = facing::left;
+ cubs[4].sides[facing::right].m = &cubs[1];
+ cubs[4].sides[facing::right].f = facing::left;
+ cubs[4].sides[facing::down].m = &cubs[5];
+ cubs[4].sides[facing::down].f = facing::left;
+
// L4R
// D1U 6 D5U
// L2R
+ cubs[5].x = 0;
+ cubs[5].y = 3 * cube_map::size;
+ cubs[5].sides[facing::up].m = &cubs[3];
+ cubs[5].sides[facing::up].f = facing::up;
+ cubs[5].sides[facing::left].m = &cubs[0];
+ cubs[5].sides[facing::left].f = facing::down;
+ cubs[5].sides[facing::right].m = &cubs[4];
+ cubs[5].sides[facing::right].f = facing::up;
+ cubs[5].sides[facing::down].m = &cubs[1];
+ cubs[5].sides[facing::down].f = facing::down;
+
+}
+
+std::pair<int64_t, int64_t> day22(line_view file) {
+ per_line(file, [](line_view lv) {
+ const char* p = lv.line;
+ if (*p == ' ' || *p == '.' || *p == '#') {
+ maps.emplace_back(p);
+ }
+ if (*p >= '0' && *p <= '9') {
+ facing f = right;
+ while (*p != '\n') {
+ routes.emplace_back(&p, &f);
+ }
+ }
+ return true;
+ });
+
+ for (auto& m : maps) {
+ tmaps.emplace_back(m);
+ }
+
+ cube_map cubs[6];
+ cube_sample(cubs);
+ // cube_input(cubs);
// facing f = right;
// for(auto& r: routes) {
@@ -224,11 +323,11 @@ std::pair<int64_t, int64_t> day22(line_view file) {
// for(auto&tm : tmaps) {
// tm.print();
// }
-
+
// char fs[] = {'>', 'v', '<', '^'};
const monkey_map& r = maps[p.y];
// printf("person is at x[%d] y[%d] facing[%c]\n", r.start + p.x + 1, p.y + 1, fs[p.f]);
- int64_t n1 = (p.y + 1) * 1000 + 4 * (r.start + p.x + 1) + (int) p.f;
+ int64_t n1 = (p.y + 1) * 1000 + 4 * (r.start + p.x + 1) + (int)p.f;
return {n1, 0};
}