commit c14aa76908d3f33e815bbbcbdfc2fba946e80010
parent 58582e7e353c9696bd4760258a4402247dc1babd
Author: bsandro <email@bsandro.tech>
Date: Wed, 3 Dec 2025 17:08:41 +0200
day03
Diffstat:
| A | day03.c | | | 63 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 63 insertions(+), 0 deletions(-)
diff --git a/day03.c b/day03.c
@@ -0,0 +1,63 @@
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <string.h>
+#include "cputime.h"
+
+static const uint64_t pow10[] = {
+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
+ 100000000, 1000000000, 10000000000, 100000000000, 1000000000000
+};
+
+typedef struct {
+ int buf[100];
+ int cnt;
+} Buffer;
+
+int find_max(int *buf, int len) {
+ int m = 0;
+ for (int i=0;i<len;++i) {
+ if (buf[i]>buf[m]) m=i;
+ }
+ return m;
+}
+
+int part1(Buffer *b) {
+ int i1 = find_max(b->buf, b->cnt-1);
+ int i2 = find_max(b->buf+i1+1, b->cnt-i1-1)+i1+1;
+ return b->buf[i1]*10+b->buf[i2];
+}
+
+uint64_t part2(Buffer *b) {
+ uint64_t num = 0;
+ int li = -1;
+ int w = b->cnt-12;
+ for (int i=0;i<12;++i) {
+ int reserve = 12-i;
+ int offset = li+1;
+ w = b->cnt-(reserve+offset-1);
+ if (reserve==1) w = b->cnt-offset;
+ li = find_max(b->buf+offset, w) + offset;
+ num += b->buf[li]*pow10[12-i-1];
+ }
+ return num;
+}
+
+int main(void) {
+ Buffer b = {0};
+ int p1 = 0;
+ uint64_t p2 = 0;
+ for (int c=getchar();c!=EOF;c=getchar()) {
+ if (c>='0'&&c<='9') {
+ b.buf[b.cnt++] = c-'0';
+ } else {
+ p1 += part1(&b);
+ p2 += part2(&b);
+ b.cnt = 0;
+ }
+ }
+ printf("p1: %d\np2: %"PRIu64"\n", p1, p2);
+ return 0;
+}