diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-01-04 15:09:37 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-01-04 15:09:37 +0800 |
commit | 571273ce8198fe9309374a4d34d67974033693ee (patch) | |
tree | e2dcb1540c2685fbd0dd20c001bc645699538b77 /src/2022/day22/aoc.cpp | |
parent | 34aa9913f5aa3c39d6e42752ab94ea1d01575d23 (diff) | |
download | advent-of-code-571273ce8198fe9309374a4d34d67974033693ee.tar.gz advent-of-code-571273ce8198fe9309374a4d34d67974033693ee.zip |
2022 day22 wrap direction
Diffstat (limited to 'src/2022/day22/aoc.cpp')
-rw-r--r-- | src/2022/day22/aoc.cpp | 91 |
1 files changed, 82 insertions, 9 deletions
diff --git a/src/2022/day22/aoc.cpp b/src/2022/day22/aoc.cpp index 69a3c9f..fc8589c 100644 --- a/src/2022/day22/aoc.cpp +++ b/src/2022/day22/aoc.cpp @@ -120,11 +120,61 @@ char cube_get(person* p, cube_map* cm) { // p->x [0, cube_map::size) // p->y [0, cube_map::size) -person wrap(person* p, cube_map** pcm, cube_map* cm, facing f) { - person p0{p->x, p->y, p->f}; + +person wrap_up(person* p, cube_map** pcm, cube_map* cm, facing f) { + person p0{p->x, p->y, f}; + switch (f) { + case right: p0.y = p->x; p0.x = 0; break; + case down: p0.y = 0; p0.x = cube_map::size - 1 - p->x; break; + case left: p0.y = cube_map::size - 1 - p->x; p0.x = cube_map::size - 1; break; + case up: p0.y = cube_map::size - 1; p0.x = p->x; break; + } + return p0; +} + +person wrap_down(person* p, cube_map** pcm, cube_map* cm, facing f) { + person p0{p->x, p->y, f}; + switch (f) { + case right: p0.y = cube_map::size - 1 - p->x; p0.x = 0; break; + case down: p0.y = 0; p0.x = p->x; break; + case left: p0.y = p->x; p0.x = cube_map::size - 1; break; + case up: p0.y = cube_map::size - 1; p0.x = cube_map::size - 1 - p->x; break; + } + return p0; +} + +person wrap_left(person* p, cube_map** pcm, cube_map* cm, facing f) { + person p0{p->x, p->y, f}; + switch (f) { + case right:p0.y = cube_map::size - 1 - p->y; p0.x = 0; break; + case down: p0.y = 0; p0.x = p->y; break; + case left: p0.y = p->y; p0.x = cube_map::size - 1; break; + case up: p0.y = cube_map::size - 1; p0.x = cube_map::size - 1 - p->y; break; + } + return p0; +} + +person wrap_right(person* p, cube_map** pcm, cube_map* cm, facing f) { + person p0{p->x, p->y, f}; + switch (f) { + case right: p0.y = p->y; p0.x = 0; break; + case down: p0.y = 0; p0.x = cube_map::size - 1 - p->y; break; + case left: p0.y = cube_map::size - 1 - p->y; p0.x = cube_map::size - 1; break; + case up: p0.y = cube_map::size - 1; p0.x = p->y; break; + } return p0; } +person wrap(person* p, cube_map** pcm, cube_map* cm, facing f) { + switch(p->f) { + case right: return wrap_right(p, pcm, cm, f); + case down: return wrap_down(p, pcm, cm, f); + case left: return wrap_left(p, pcm, cm, f); + case up: return wrap_up(p, pcm, cm, f); + } + return *p; +} + void cube_up(int s, person* p, cube_map** pcm); void cube_down(int s, person* p, cube_map** pcm); void cube_left(int s, person* p, cube_map** pcm); @@ -132,6 +182,7 @@ void cube_right(int s, person* p, cube_map** pcm); void cube_up(int s, person* p, cube_map** pcm) { if (s > 0) { + mark((*pcm)->x + p->x, (*pcm)->y + p->y, '^'); if (p->y > 0) { person p0{p->x, p->y - 1, p->f}; if (cube_get(&p0, *pcm) == '.') { @@ -143,6 +194,10 @@ void cube_up(int s, person* p, cube_map** pcm) { cube_map* cm = (*pcm)->sides[facing::up].m; facing f = (*pcm)->sides[facing::up].f; person p0 = wrap(p, pcm, cm, f); + + char fs[] = {'>', 'v', '<', '^'}; + printf("wrap up p0[%d, %d, %c]\n", p0.x, p0.y, fs[p0.f]); + if (cube_get(&p0, cm) == '.') { *p = p0; *pcm = cm; @@ -159,6 +214,7 @@ void cube_up(int s, person* p, cube_map** pcm) { void cube_down(int s, person* p, cube_map** pcm) { if (s > 0) { + mark((*pcm)->x + p->x, (*pcm)->y + p->y, 'v'); if (p->y < cube_map::size - 1) { person p0{p->x, p->y + 1, p->f}; if (cube_get(&p0, *pcm) == '.') { @@ -170,6 +226,10 @@ void cube_down(int s, person* p, cube_map** pcm) { cube_map* cm = (*pcm)->sides[facing::down].m; facing f = (*pcm)->sides[facing::down].f; person p0 = wrap(p, pcm, cm, f); + + char fs[] = {'>', 'v', '<', '^'}; + printf("wrap down p0[%d, %d, %c]\n", p0.x, p0.y, fs[p0.f]); + if (cube_get(&p0, cm) == '.') { *p = p0; *pcm = cm; @@ -186,6 +246,7 @@ void cube_down(int s, person* p, cube_map** pcm) { void cube_left(int s, person* p, cube_map** pcm) { if (s > 0) { + mark((*pcm)->x + p->x, (*pcm)->y + p->y, '<'); if (p->x > 0) { person p0{p->x - 1, p->y, p->f}; if (cube_get(&p0, *pcm) == '.') { @@ -197,6 +258,10 @@ void cube_left(int s, person* p, cube_map** pcm) { cube_map* cm = (*pcm)->sides[facing::left].m; facing f = (*pcm)->sides[facing::left].f; person p0 = wrap(p, pcm, cm, f); + + char fs[] = {'>', 'v', '<', '^'}; + printf("wrap left p0[%d, %d, %c]\n", p0.x, p0.y, fs[p0.f]); + if (cube_get(&p0, cm) == '.') { *p = p0; *pcm = cm; @@ -213,6 +278,7 @@ void cube_left(int s, person* p, cube_map** pcm) { void cube_right(int s, person* p, cube_map** pcm) { if (s > 0) { + mark((*pcm)->x + p->x, (*pcm)->y + p->y, '>'); if (p->x < cube_map::size - 1) { person p0{p->x + 1, p->y, p->f}; if (cube_get(&p0, *pcm) == '.') { @@ -224,6 +290,10 @@ void cube_right(int s, person* p, cube_map** pcm) { cube_map* cm = (*pcm)->sides[facing::right].m; facing f = (*pcm)->sides[facing::right].f; person p0 = wrap(p, pcm, cm, f); + + char fs[] = {'>', 'v', '<', '^'}; + printf("wrap right p0[%d, %d, %c]\n", p0.x, p0.y, fs[p0.f]); + if (cube_get(&p0, cm) == '.') { *p = p0; *pcm = cm; @@ -239,9 +309,12 @@ void cube_right(int s, person* p, cube_map** pcm) { } void travel_cube(person* p, cube_map** pcm, const route& r) { + char fs[] = {'>', 'v', '<', '^'}; if (r.is_step == false) { + printf("%c", fs[r.ins.f]); p->f = r.ins.f; } else { + printf("%d\n", r.ins.steps); switch (p->f) { case up: cube_up(r.ins.steps, p, pcm); @@ -312,7 +385,7 @@ void cube_sample(cube_map cubs[6]) { 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::right].f = facing::down; cubs[3].sides[facing::down].m = &cubs[4]; cubs[3].sides[facing::down].f = facing::down; @@ -472,13 +545,13 @@ std::pair<int64_t, int64_t> day22(line_view file) { for (auto& r : routes) { travel_cube(&pc, &cm, r); } - int64_t n2 = (cm->y + p.y + 1) * 1000 + 4 * (cm->x + p.x + 1) + (int)p.f; - // char fs[] = {'>', 'v', '<', '^'}; - // printf("person is at x[%d] y[%d] facing[%c]\n", r.start + p.x + 1, p.y + 1, fs[p.f]); + int64_t n2 = (cm->y + pc.y + 1) * 1000 + 4 * (cm->x + pc.x + 1) + (int)pc.f; + char fs[] = {'>', 'v', '<', '^'}; + printf("person is at x[%d %d] y[%d %d] facing[%c]\n", cm->x, pc.x, cm->y, pc.y, fs[pc.f]); - // for(auto&tm : tmaps) { - // tm.print(); - // } + for(auto&tm : tmaps) { + tm.print(); + } return {n1, n2}; } |