commit f8010e86532cb3acfd44ca8aabe39d7eac411907
parent 0e7e16473058809784f0a6a04508da839423a744
Author: bsandro <[email protected]>
Date: Sat, 25 Dec 2021 13:38:28 +0200
Day 25 puzzle 1
Diffstat:
M | day25/puzzle.c | | | 92 | ++++++++++++++++++++++++++++++++++++++++++++----------------------------------- |
1 file changed, 51 insertions(+), 41 deletions(-)
diff --git a/day25/puzzle.c b/day25/puzzle.c
@@ -25,8 +25,14 @@ struct tile_t {
struct cucumber_t *cucumber;
};
-void print_tiles(struct tile_t (*tiles)[9][10]);
-int step(struct tile_t (*tiles)[9][10], uint64_t step);
+struct map_t {
+ struct tile_t *tiles;
+ int width;
+ int height;
+};
+
+void print_map(struct map_t *map);
+int step(struct map_t *map, uint64_t step);
void puzzle(const char *filename, long long *result1, long long *result2) {
FILE *infile = fopen(filename, "r");
@@ -37,13 +43,18 @@ void puzzle(const char *filename, long long *result1, long long *result2) {
char buf[STR_LEN] = {0};
size_t line = 0;
-
- // test data only
- struct tile_t tiles[9][10] = {0};
+ struct map_t map = {0};
while (fgets(buf, STR_LEN, infile) != NULL) {
int len = strlen(buf);
assert(len > 0);
+ if (map.width > 0 && map.width != len-1) {
+ printf("invalid input\n");
+ exit(1);
+ }
+ map.width = len-1;
+ line = map.height++;
+ map.tiles = realloc(map.tiles, sizeof(struct tile_t) * map.width * map.height);
for (int i = 0; i < len-1; ++i) {
char c = buf[i];
if (c == '>' || c == 'v') {
@@ -52,38 +63,37 @@ void puzzle(const char *filename, long long *result1, long long *result2) {
cucumber->direction = (c == '>') ? EAST : SOUTH;
cucumber->stuck = false;
cucumber->step = 0;
- tiles[line][i].cucumber = cucumber;
+ map.tiles[line*map.width+i].cucumber = cucumber;
+ } else {
+ map.tiles[line*map.width+i].cucumber = NULL;
}
}
- line++;
bzero(buf, STR_LEN);
}
- //print_tiles(&tiles);
+ //printf("map width: %d, height: %d\n", map.width, map.height);
+ //print_map(&map);
for (uint64_t i = 1;; ++i) {
- //printf("- step %llu -\n", i);
- if (step(&tiles, i) == 0) {
- //printf("step %llu is final\n", i);
- //print_tiles(&tiles);
+ if (step(&map, i) == 0) {
*result1 = i;
break;
}
- //print_tiles(&tiles);
}
-
+ //print_map(&map);
*result2 = 0;
// mutiny! ignoring feof/ferror.
fclose(infile);
}
-void print_tiles(struct tile_t (*tiles)[9][10]) {
+void print_map(struct map_t *map) {
+ assert(map != NULL);
printf("----------\n");
- for (int y = 0; y < 9; ++y) {
- for (int x = 0; x < 10; ++x) {
- if ((*tiles)[y][x].cucumber != NULL) {
- struct cucumber_t *cucumber = (*tiles)[y][x].cucumber;
- printf("%c", cucumber->direction == SOUTH ? 'v' : '>');
+ for (int y = 0; y < map->height; ++y) {
+ for (int x = 0; x < map->width; ++x) {
+ struct tile_t *tile = &map->tiles[y*map->width+x];
+ if (tile->cucumber != NULL) {
+ printf("%c", tile->cucumber->direction == SOUTH ? 'v' : '>');
} else {
printf(".");
}
@@ -93,24 +103,24 @@ void print_tiles(struct tile_t (*tiles)[9][10]) {
printf("\n");
}
-int step(struct tile_t (*tiles)[9][10], uint64_t step) {
+int step(struct map_t *map, uint64_t step) {
int moved = 0;
// eastbound cucumbers
- for (int y = 0; y < 9; ++y) {
- for (int x = 0; x < 10; ++x) {
- int nx = (x == 10-1) ? 0 : x+1;
- struct tile_t *tile = &(*tiles)[y][x];
- struct tile_t *next = &(*tiles)[y][nx];
+ for (int y = 0; y < map->height; ++y) {
+ for (int x = 0; x < map->width; ++x) {
+ int nx = (x == map->width-1) ? 0 : x+1;
+ struct tile_t *tile = &map->tiles[map->width*y+x];
+ struct tile_t *next = &map->tiles[map->width*y+nx];
if (tile->cucumber != NULL && tile->cucumber->direction == EAST && tile->cucumber->step != step) {
tile->cucumber->stuck = next->cucumber != NULL;
}
}
}
- for (int y = 0; y < 9; ++y) {
- for (int x = 0; x < 10; ++x) {
- int nx = (x == 10-1) ? 0 : x+1;
- struct tile_t *tile = &(*tiles)[y][x];
- struct tile_t *next = &(*tiles)[y][nx];
+ for (int y = 0; y < map->height; ++y) {
+ for (int x = 0; x < map->width; ++x) {
+ int nx = (x == map->width-1) ? 0 : x+1;
+ struct tile_t *tile = &map->tiles[map->width*y+x];
+ struct tile_t *next = &map->tiles[map->width*y+nx];
if (tile->cucumber != NULL && tile->cucumber->direction == EAST && !tile->cucumber->stuck && tile->cucumber->step != step) {
assert(next->cucumber == NULL);
tile->cucumber->step = step;
@@ -121,21 +131,21 @@ int step(struct tile_t (*tiles)[9][10], uint64_t step) {
}
}
// southbound cucumbers
- for (int y = 0; y < 9; ++y) {
- int ny = (y == 9-1) ? 0 : y+1;
- for (int x = 0; x < 10; ++x) {
- struct tile_t *tile = &(*tiles)[y][x];
- struct tile_t *next = &(*tiles)[ny][x];
+ for (int y = 0; y < map->height; ++y) {
+ int ny = (y == map->height-1) ? 0 : y+1;
+ for (int x = 0; x < map->width; ++x) {
+ struct tile_t *tile = &map->tiles[map->width*y+x];
+ struct tile_t *next = &map->tiles[map->width*ny+x];
if (tile->cucumber != NULL && tile->cucumber->direction == SOUTH && tile->cucumber->step != step) {
tile->cucumber->stuck = next->cucumber != NULL;
}
}
}
- for (int y = 0; y < 9; ++y) {
- int ny = (y == 9-1) ? 0 : y+1;
- for (int x = 0; x < 10; ++x) {
- struct tile_t *tile = &(*tiles)[y][x];
- struct tile_t *next = &(*tiles)[ny][x];
+ for (int y = 0; y < map->height; ++y) {
+ int ny = (y == map->height-1) ? 0 : y+1;
+ for (int x = 0; x < map->width; ++x) {
+ struct tile_t *tile = &map->tiles[map->width*y+x];
+ struct tile_t *next = &map->tiles[map->width*ny+x];
if (tile->cucumber != NULL && tile->cucumber->direction == SOUTH && !tile->cucumber->stuck && tile->cucumber->step != step) {
assert(next->cucumber == NULL);
tile->cucumber->step = step;