commit 1580b3c4c755f07896b0ef742b72d5a6f11ab539
parent 47634b6c8a003dbee3444f5521e3a40dc433ae53
Author: bsandro <email@bsandro.tech>
Date: Tue, 2 Dec 2025 08:59:48 +0200
day02 p2
Diffstat:
| M | day02.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;
}