diff options
Diffstat (limited to '')
-rw-r--r-- | 2020/day11.c | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/2020/day11.c b/2020/day11.c index f8552ca..360cf49 100644 --- a/2020/day11.c +++ b/2020/day11.c @@ -21,7 +21,7 @@ static int adj(const struct Grid *grid, int y, int x) { (at(grid, y + 1, x + 1) == '#') ); } -static struct Grid gen(const struct Grid *prev) { +static struct Grid gen1(const struct Grid *prev) { struct Grid next = { .h = prev->h, .w = prev->w }; for (int y = 0; y < next.h; ++y) { for (int x = 0; x < next.w; ++x) { @@ -36,6 +36,43 @@ static struct Grid gen(const struct Grid *prev) { } return next; } +static char ray(const struct Grid *grid, int y, int x, int dy, int dx) { + y += dy; + x += dx; + while (y >= 0 && y < grid->h && x >= 0 && x < grid->w) { + if (grid->c[y][x] != '.') return grid->c[y][x]; + y += dy; + x += dx; + } + return '.'; +} +static int see(const struct Grid *grid, int y, int x) { + return ( + (ray(grid, y, x, -1, -1) == '#') + + (ray(grid, y, x, -1, +0) == '#') + + (ray(grid, y, x, -1, +1) == '#') + + (ray(grid, y, x, +0, -1) == '#') + + (ray(grid, y, x, +0, +1) == '#') + + (ray(grid, y, x, +1, -1) == '#') + + (ray(grid, y, x, +1, +0) == '#') + + (ray(grid, y, x, +1, +1) == '#') + ); +} +static struct Grid gen2(const struct Grid *prev) { + struct Grid next = { .h = prev->h, .w = prev->w }; + for (int y = 0; y < next.h; ++y) { + for (int x = 0; x < next.w; ++x) { + if (prev->c[y][x] == 'L' && !see(prev, y, x)) { + next.c[y][x] = '#'; + } else if (prev->c[y][x] == '#' && see(prev, y, x) >= 5) { + next.c[y][x] = 'L'; + } else { + next.c[y][x] = prev->c[y][x]; + } + } + } + return next; +} int main(void) { struct Grid init = {0}; while (EOF != scanf("%s\n", init.c[init.h])) { @@ -44,7 +81,7 @@ int main(void) { init.w = strlen(init.c[0]); struct Grid prev = init; for (;;) { - struct Grid next = gen(&prev); + struct Grid next = gen1(&prev); if (!memcmp(&next, &prev, sizeof(next))) break; prev = next; } @@ -55,4 +92,17 @@ int main(void) { } } printf("%d\n", occ); + prev = init; + for (;;) { + struct Grid next = gen2(&prev); + if (!memcmp(&next, &prev, sizeof(next))) break; + prev = next; + } + occ = 0; + for (int y = 0; y < prev.h; ++y) { + for (int x = 0; x < prev.w; ++x) { + occ += prev.c[y][x] == '#'; + } + } + printf("%d\n", occ); } |