aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day22/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-04 15:09:37 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-04 15:09:37 +0800
commit571273ce8198fe9309374a4d34d67974033693ee (patch)
treee2dcb1540c2685fbd0dd20c001bc645699538b77 /src/2022/day22/aoc.cpp
parent34aa9913f5aa3c39d6e42752ab94ea1d01575d23 (diff)
downloadadvent-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.cpp91
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};
}