diff options
Diffstat (limited to 'src/2022/day22/aoc.cpp')
-rw-r--r-- | src/2022/day22/aoc.cpp | 199 |
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}; } |