diff --git a/19/19-1and2.c b/19/19-1and2.c new file mode 100644 index 0000000..887deb6 --- /dev/null +++ b/19/19-1and2.c @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include "../check_alloc.h" + +#define LUT_LENGTH 512 +#define ITERATIONS 50 +// THERE'S SOME UNDEFINED BEHAVIOR WHICH +// EXPANDS FROM THE CORNERS - EXCLUDE THESE AREAS +#define EXCLUDED_AREA (ITERATIONS + 1) +#define EXPANDED_SPACE (ITERATIONS + EXCLUDED_AREA) + +bool *get_lut(FILE *p_file) +{ + char buf[BUFSIZ]; + bool *lut = calloc(LUT_LENGTH, sizeof(bool)); + fgets(buf, sizeof buf, p_file); + for (size_t i = 0; i < LUT_LENGTH; i++) + lut[i] = buf[i] == '#'; + return lut; +} + +typedef struct +{ + bool **space; + int space_size; +} SPACE; + +SPACE *get_space(FILE *p_file) +{ + SPACE *p_space = malloc(sizeof(SPACE)); + CHECK_ALLOC(p_space); + char buf[BUFSIZ]; + fgets(buf, sizeof buf, p_file); + if (strlen(buf) >= BUFSIZ) + exit(EXIT_FAILURE); + size_t ic_size = strlen(buf) - 1; // -1 FOR \n + p_space->space_size = ic_size + 2 * (EXPANDED_SPACE); + + // ALLOCATE SPACE + p_space->space = calloc(p_space->space_size, sizeof(bool *)); + CHECK_ALLOC(p_space->space); + for (size_t i = 0; i < p_space->space_size; i++) + { + p_space->space[i] = calloc(p_space->space_size, sizeof(bool)); + CHECK_ALLOC(p_space->space[i]); + } + // SPACE + + for (size_t j = 0; j < ic_size; j++) + { + for (size_t i = 0; i < ic_size; i++) + p_space->space[j + EXPANDED_SPACE][i + EXPANDED_SPACE] = buf[i] == '#'; + fgets(buf, sizeof buf, p_file); + } + return p_space; +} + +void print_space(SPACE *space) +{ + for (size_t i = 0; i < space->space_size; i++) + { + for (size_t j = 0; j < space->space_size; j++) + putchar(space->space[i][j] ? '#' : '.'); + putchar('\n'); + } + putchar('\n'); +} + +bool space_value(SPACE *space, int i, int j) +{ + if (i < 0 || j < 0 || i >= space->space_size || j >= space->space_size) + return false; + return space->space[i][j]; +} + +// +void step_space(SPACE *space, bool *lut) +{ + bool buffer[space->space_size][space->space_size]; + memset(buffer, false, space->space_size * space->space_size * sizeof(bool)); + for (int i = 0; i < space->space_size; i++) + { + for (int j = 0; j < space->space_size; j++) + { + char number[9]; + int idx = 0; + for (int y = j - 1; y <= j + 1; y++) + { + for (int x = i - 1; x <= i + 1; x++) + { + number[idx] = space_value(space, y, x) ? '1' : '0'; + idx++; + } + } + buffer[j][i] = lut[strtol(number, NULL, 2)]; + } + } + for (int i = 0; i < space->space_size; i++) + memcpy(space->space[i], buffer[i], space->space_size * sizeof(bool)); +} + +int count_space(SPACE *space) +{ + int count = 0; + // IGNORE BOUNDARY (REPRESENTS INFINITE SIZE OF SPACE) + for (size_t i = EXCLUDED_AREA; i < space->space_size - EXCLUDED_AREA; i++) + for (size_t j = EXCLUDED_AREA; j < space->space_size - EXCLUDED_AREA; j++) + count += space->space[i][j]; + return count; +} + +int main(int argc, char const *argv[]) +{ + FILE *p_file = fopen("input", "r"); + bool *lut = get_lut(p_file); + + fscanf(p_file, "%s", NULL); // SKIP LINE + + SPACE *space = get_space(p_file); + + for (size_t i = 0; i < ITERATIONS; i++) + step_space(space, lut); + printf("COUNT %d\n", count_space(space)); + + return 0; +}