aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2025-12-07 06:46:12 +0100
committerThomas Voss <mail@thomasvoss.com> 2025-12-07 06:46:12 +0100
commitdbaa30aa4413db70fd975054c676eb6084512293 (patch)
tree540127d84f6f5b1d51755c37dc7504c64b405ae6
parente37b3ebf682be8b9b3ba0ddfc53eb2cd1768b22c (diff)
Add 2025 day 3 solutions
-rw-r--r--2025/03/.gitignore1
-rw-r--r--2025/03/Makefile1
-rw-r--r--2025/03/puzzles.c48
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;
+}