diff options
| -rw-r--r-- | 2025/03/.gitignore | 1 | ||||
| -rw-r--r-- | 2025/03/Makefile | 1 | ||||
| -rw-r--r-- | 2025/03/puzzles.c | 48 |
3 files changed, 50 insertions, 0 deletions
diff --git a/2025/03/.gitignore b/2025/03/.gitignore new file mode 100644 index 0000000..60d075d --- /dev/null +++ b/2025/03/.gitignore @@ -0,0 +1 @@ +puzzle-[12] diff --git a/2025/03/Makefile b/2025/03/Makefile new file mode 100644 index 0000000..de3f940 --- /dev/null +++ b/2025/03/Makefile @@ -0,0 +1 @@ +include ../../Makefiles/c.mk diff --git a/2025/03/puzzles.c b/2025/03/puzzles.c new file mode 100644 index 0000000..9bd68ee --- /dev/null +++ b/2025/03/puzzles.c @@ -0,0 +1,48 @@ +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef PART1 + #define DIGITS ((size_t)(2)) +#else + #define DIGITS ((size_t)(12)) +#endif + +int +main(void) +{ + FILE *fp = fopen("input", "r"); + if (fp == nullptr) + err(EXIT_FAILURE, "failed to open input"); + + char *buf = nullptr; + size_t acc, bufsz; + ssize_t n; + + acc = bufsz = 0; + + while ((n = getline(&buf, &bufsz, fp)) != -1) { + if (buf[n - 1] == '\n') + buf[--n] = 0; + + char digits[DIGITS + 1]; + memcpy(digits, buf, DIGITS); + digits[DIGITS] = 0; + + for (size_t i = 1; i < n - DIGITS + 1; i++) { + for (size_t j = 0; j < DIGITS; j++) { + if (buf[i + j] > digits[j]) + memcpy(digits + j, buf + i + j, DIGITS - j); + } + } + + acc += (size_t)strtol(digits, nullptr, 10); + } + if (ferror(fp)) + err(EXIT_FAILURE, "failed to read record"); + + fclose(fp); + printf("%zu\n", acc); + return EXIT_SUCCESS; +} |