advent2025

Advent of Code 2025 Solutions
git clone git://bsandro.tech/advent2025
Log | Files | Refs | LICENSE

commit c14aa76908d3f33e815bbbcbdfc2fba946e80010
parent 58582e7e353c9696bd4760258a4402247dc1babd
Author: bsandro <email@bsandro.tech>
Date:   Wed,  3 Dec 2025 17:08:41 +0200

day03

Diffstat:
Aday03.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; +}