advent2025

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

commit 1580b3c4c755f07896b0ef742b72d5a6f11ab539
parent 47634b6c8a003dbee3444f5521e3a40dc433ae53
Author: bsandro <email@bsandro.tech>
Date:   Tue,  2 Dec 2025 08:59:48 +0200

day02 p2

Diffstat:
Mday02.c | 40+++++++++++++++++++++++++++++++++-------
1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/day02.c b/day02.c @@ -1,6 +1,7 @@ #include <stdio.h> #include <inttypes.h> #include <math.h> +#include <string.h> #include "cputime.h" typedef struct Range { @@ -8,17 +9,26 @@ typedef struct Range { uint64_t last; } Range; +inline int digits(uint64_t num) { + return log10l(num)+1; +} + inline uint64_t btoi(uint64_t buf[32], int bufs) { uint64_t num = 0; for (int i=0;i<bufs;++i) num = num*10+buf[i]; return num; } -inline int digits(uint64_t num) { - return log10l(num)+1; +inline void itoa(uint64_t num, char str[32]) { //unused + int d = digits(num); + for (int i=0;i<d;++i) { + str[i] = num%10+'0'; + } + str[d] = '\0'; + printf("itoa %lu -> %s\n", num, str); } -inline bool is_silly(uint64_t num) { +inline bool is_silly1(uint64_t num) { int d = digits(num); if (d%2==0) { long shift = powl(10, d/2); @@ -29,10 +39,24 @@ inline bool is_silly(uint64_t num) { return false; } -inline uint64_t sum_silly(Range range) { +inline bool is_silly2(uint64_t num) { + int d = digits(num); + char s[32] = {0}; + snprintf(s, 31, "%lu", num); // gave up on atoi for now + for (int i=1;i<=d/2;++i) { // checking pattern 0-i + int rep = 0; + for (int j=0;j<d;j+=i) { + rep |= strncmp(s, s+j, i); + } + if (rep==0) return true; + } + return false; +} + +inline uint64_t sum_silly(Range range, bool (*check_silly)(uint64_t)) { uint64_t sum = 0; for (uint64_t i=range.first;i<=range.last;++i) { - if (is_silly(i)) sum+=i; + if (check_silly(i)) sum+=i; } return sum; } @@ -42,6 +66,7 @@ int main(void) { int bufs = 0; Range range = {0}; uint64_t p1 = 0; + uint64_t p2 = 0; for (int c=getchar();c!=EOF;c=getchar()) { if (c>='0'&&c<='9') { buf[bufs++] = c-'0'; @@ -52,9 +77,10 @@ int main(void) { range.last = btoi(buf, bufs); bufs = 0; //printf("%"PRIu64"->%"PRIu64"\n", range.first, range.last); - p1 += sum_silly(range); + p1 += sum_silly(range, is_silly1); + p2 += sum_silly(range, is_silly2); } } - printf("p1: %" PRIu64 "\n", p1); + printf("p1: %" PRIu64 "\np2: %" PRIu64 "\n", p1, p2); return 0; }