diff options
| author | Bond_009 <bond.009@outlook.com> | 2020-12-11 19:06:58 +0100 |
|---|---|---|
| committer | Bond_009 <bond.009@outlook.com> | 2020-12-11 19:06:58 +0100 |
| commit | cbaaf6b1fd471e5ef18a6efa29e54ea9ce23d729 (patch) | |
| tree | 267664f1670646c3422a81ba97772dbed5888464 | |
| parent | 14eb4f0ec02b62d42dc0be5c0c73955e4c1b19e2 (diff) | |
Add day 10
| -rw-r--r-- | 11/input | 90 | ||||
| -rw-r--r-- | 11/part1.c | 123 | ||||
| -rw-r--r-- | 11/part2.c | 202 | ||||
| -rw-r--r-- | 11/testinput | 10 |
4 files changed, 425 insertions, 0 deletions
diff --git a/11/input b/11/input new file mode 100644 index 0000000..c367ad5 --- /dev/null +++ b/11/input @@ -0,0 +1,90 @@ +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLL..L.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LL.LLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL..LLLL.LLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +...L..LLL.L...........L....LL........LLL....L..L.......LLLLL.LL.....LL.LL...L..LLL.L......L.... +LLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL +LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLL.LLL..LLLLLLLLLLL.LLLLLLL.LLL.L.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLL..LLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +..LL.......L.L..L.LL......L.L....L...L...L.L........L.....L......LL...LL.LL.L........LLL.LL.... +LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.L.L.LLLLL.LLLLLLLLLL +LLLLLLLL.LLLL..LLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLL.LLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLLL.LLLLLLL..LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +.L..LLL...L.LLL..L..L....L....LL..LL...LL..LLLL.L.....L.L...........LL........L....L.L...L..LL. +LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLL.L.LLLLLLLLLL +LLLLLLLL.L.LL.L.LLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL +L.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLLL +.LL.L....L.L..LL..L..L..LL.L...L.....L...LL......LLL...L...LL....L.L.......L.....L...L.L......L +LLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLLL.L.LL..LL.LLL.LLLLL.L.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLL.LL +LLLLLL.LLLLLL.LLLLLLLL..L.LLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLLLLLL..LLLLL.LLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLL +LLLLLLLL.L.L..LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLL.L...LLLL.LLLLL.LL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLL.LLL.LLLLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL.LLLLLLLLLL +L.L..L...LL.L..L..L..L.L.L..L......................L...L..LLLL..LLLL..LL....L...LL..L.....L.... +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LL.LLLLL..LL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLL..LLLL.LL..L.LLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLL +LL.LL...L...LL.LLL...L...LL.LL..L.L.L...L.L.......L..L..L.LLL..LL...LLLLL..L..LL..L.....L...LL. +LLLLLLLL.LLLLLLLLLLLLLL..LL.L.LLL.LLLLL.LLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.L.LLL.LLLLLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLL +LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLL.LLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLLLL..LLLLLLLLLLLLLLLLLLLL.LLLLL.LLL.LL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLL +L.L................L..L.L.LL..L..L..L.L..L.LLLL..........L..LL.LL.L...LL...L....L...LL..L.L.L.L +.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLL +.LLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLL.LLLLL.LLLL.L.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLL..LLLLLLLLLLLL.LLLLLLLL.L.LLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL +LLLL.LLLLLL.L..LLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLL.LLLLLL.L.LLLLLLLL.LLLLLLLLLL.LLLLLLL +LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.L.LLLLL.LLLLLLLLLL +L..LL...L...L...L.LL..LL......LL..LL....L.L...........L.L...L....LL.LL.L..LL....L..L.........LL +L.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLL.LL.LLLLLL.LLLLLLL.LLLLLLLLLL +LLLLLLL.LL.LL.LLLLLLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL..LL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL..LLLLLL.LLLLL.LLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LL +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +.L.LL..L...L........L.......L.....L.L.L....L......L.LL......L...LL.L.LLLL...LLL.L...L..L.LLLL.. +LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLL +L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLL.L.L.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LL +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL..LLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +L.LLLLLLLLLLLLLLLLLLLLL.L.LLLLLLL.LLLLL.LLLL..LLLLLL.LLL.L.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL +LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.LLLLL.LLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLL.L.LLLLLL.LLL +LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL..LLLLL.LLLLL.LL.LLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL +....LLL.L...LL.L.LLLLLL...L........L.L...L.L.L..L....LL..LL.L..LL...L.L.LLL.LL...LL..L.L..LL... +LLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLL..LLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.L.LLLLL.LLLLLLLLLL +LLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL +LLLLLLLLL.LLL.LLLLLLLLL.LLLLLLLLL.LLLLL..LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.L.LLLLLLLL +LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLL..LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.L +LLLLLLL.LLLL..LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLL.LL.LL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL +LLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL +L.LL.LLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLL.LLLLLL.LLL +LLLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLL.L.LLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLL +LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLL.L.LLLLL.LL +LLLLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL diff --git a/11/part1.c b/11/part1.c new file mode 100644 index 0000000..459befe --- /dev/null +++ b/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/11/part2.c b/11/part2.c new file mode 100644 index 0000000..2443ddd --- /dev/null +++ b/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])); +} diff --git a/11/testinput b/11/testinput new file mode 100644 index 0000000..cdea6b5 --- /dev/null +++ b/11/testinput @@ -0,0 +1,10 @@ +#.##.##.## +#######.## +#.#.#..#.. +####.##.## +#.##.##.## +#.#####.## +..#.#..... +########## +#.######.# +#.#####.## |
