diff options
| author | Bond_009 <bond.009@outlook.com> | 2022-12-01 22:30:22 +0100 |
|---|---|---|
| committer | Bond_009 <bond.009@outlook.com> | 2022-12-01 22:30:22 +0100 |
| commit | baf4910870a6e8999802b9a4a22eabd4142a34e3 (patch) | |
| tree | 2d11443dc21e53bd0d99d015cf789937d6d95862 /2020/11 | |
| parent | 49d0c908f24b2c193c9deed1716fe36061ba26a1 (diff) | |
Move all Advent of Codes into one repo
Diffstat (limited to '2020/11')
| -rw-r--r-- | 2020/11/part1.c | 123 | ||||
| -rw-r--r-- | 2020/11/part2.c | 202 |
2 files changed, 325 insertions, 0 deletions
diff --git a/2020/11/part1.c b/2020/11/part1.c new file mode 100644 index 0000000..459befe --- /dev/null +++ b/2020/11/part1.c @@ -0,0 +1,123 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <malloc.h> +#include <string.h> + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +int count_char(const char *source, char search) +{ + int oc = 0; + do { + oc += *source == search; + } while (*++source); + + return oc; +} + +void replace_char(char *destination, const char *source, char original, char replace) +{ + do { + if (*source == original) { + *destination = replace; + } + else { + *destination = *source; + } + } while (++destination && *++source); + *destination = 0; +} + +int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) +{ + int num = 0; + // Check 3 seats on the line above + if (index_y > 0) { + size_t x = index_x == 0 ? index_x : index_x - 1; + size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; + for (; x < end_x; x++) { + num += source[(index_y - 1) * width + x] == '#'; + } + } + + // Check sides + if (index_x > 0) { + num += source[index_y * width + index_x - 1] == '#'; + } + + if (index_x < width - 1) { + num += source[index_y * width + index_x + 1] == '#'; + } + + // Check 3 seats on the line above + if (index_y < height - 1) { + size_t x = index_x == 0 ? index_x : index_x - 1; + size_t end_x = index_x < width - 1 ? index_x + 2 : index_x + 1; + for (; x < end_x; x++) { + num += source[(index_y + 1) * width + x] == '#'; + } + } + + return num; +} + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + char input[MAX_INPUT] = { 0 }; + size_t height = 1; + fgets(buffer, 128, file); + size_t width = strchr(buffer, '\n') - buffer; + replace_char(input, buffer, 'L', '#'); + + while (fgets(buffer, 128, file)) { + // Round 1 + replace_char(&input[height++ * width], buffer, 'L', '#'); + } + + fclose(file); + + size_t size = height * width; + + // Zero terminate + input[size] = 0; + + char input2[MAX_INPUT] = { 0 }; + do { + for (size_t i = 0; i < size; i++) { + if (input[i] == '.') { + input2[i] = '.'; + } + else if (input[i] == 'L') { + if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { + input2[i] = '#'; + } + else { + input2[i] = 'L'; + } + } + else if (input[i] == '#') { + if (sur_oc_seats(input, width, height, i / width, i % width) >= 4) { + input2[i] = 'L'; + } + else { + input2[i] = '#'; + } + } + } + } while (memcmp(input, input2, size) && memcpy(input, input2, size)); + + return count_char(input, '#'); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} diff --git a/2020/11/part2.c b/2020/11/part2.c new file mode 100644 index 0000000..2443ddd --- /dev/null +++ b/2020/11/part2.c @@ -0,0 +1,202 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <malloc.h> +#include <string.h> + +#define MAX_INPUT_WIDTH 128 +#define MAX_INPUT_HEIGTH 128 +#define MAX_INPUT MAX_INPUT_WIDTH * MAX_INPUT_HEIGTH + +int count_char(const char *source, char search) +{ + int oc = 0; + do { + oc += *source == search; + } while (*++source); + + return oc; +} + +void replace_char(char *destination, const char *source, char original, char replace) +{ + do { + if (*source == original) { + *destination = replace; + } + else { + *destination = *source; + } + } while (++destination && *++source); + *destination = 0; +} + +char get_char(const char *source, size_t width, size_t y, size_t x) { + return source[y * width + x]; +} + +int sur_oc_seats(const char *source, size_t width, size_t height, size_t index_y, size_t index_x) +{ + int num = 0; + // Check upwards + size_t y = index_y; + size_t x = index_x; + while (--y < height) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check downwards + y = index_y; + while (++y < height) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left + y = index_y; + x = index_x; + while (--x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right + x = index_x; + while (++x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left upwards + y = index_y; + x = index_x; + while (--y < height && --x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check left downwards + y = index_y; + x = index_x; + while (++y < height && --x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right upwards + y = index_y; + x = index_x; + while (--y < height && ++x < width) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + // Check right downwards + y = index_y; + x = index_x; + while (++y < height && ++x < width ) { + char c = get_char(source, width, y, x); + if (c == '.') { + continue; + } + + num += c == '#'; + break; + } + + return num; +} + +int solve(const char *filename) +{ + FILE *file = fopen(filename, "r"); + + // Include space for newline and string terminator + char buffer[128] = { 0 }; + + char input[MAX_INPUT] = { 0 }; + size_t height = 1; + fgets(buffer, 128, file); + size_t width = strchr(buffer, '\n') - buffer; + replace_char(input, buffer, 'L', '#'); + + while (fgets(buffer, 128, file)) { + // Round 1 + replace_char(&input[height++ * width], buffer, 'L', '#'); + } + + fclose(file); + + size_t size = height * width; + + // Zero terminate + input[size] = 0; + + char input2[MAX_INPUT] = { 0 }; + do { + for (size_t i = 0; i < size; i++) { + if (input[i] == '.') { + input2[i] = '.'; + } + else if (input[i] == 'L') { + if (sur_oc_seats(input, width, height, i / width, i % width) == 0) { + input2[i] = '#'; + } + else { + input2[i] = 'L'; + } + } + else if (input[i] == '#') { + if (sur_oc_seats(input, width, height, i / width, i % width) >= 5) { + input2[i] = 'L'; + } + else { + input2[i] = '#'; + } + } + } + } while (memcmp(input, input2, size) && memcpy(input, input2, size)); + + return count_char(input, '#'); +} + +int main(int argc, char *argv[]) +{ + printf("%i\n", solve(argv[argc - 1])); +} |
