commit e5244a3f8e25b183fe488c44e752b9f745390f40
parent 8e308a8b6f1cd70d172aed00b55b051b9b6dfb5a
Author: bsandro <email@bsandro.tech>
Date: Sat, 6 Dec 2025 19:41:54 +0200
day06 p2 distusting variant but work
Diffstat:
| M | day06.c | | | 73 | +++++++++++++++++++++++++++++++++++-------------------------------------- |
1 file changed, 35 insertions(+), 38 deletions(-)
diff --git a/day06.c b/day06.c
@@ -3,14 +3,8 @@
#include "cputime.h"
// tail -n1 inputs/day06.txt | sed 's/\s/\n/g'|sort|grep '+\|*'|wc -l
-#define W 1001
-#define H 4
-#define DIG 4
-
-typedef struct {
- char symbols[DIG];
- int len;
-} Number;
+#define W 3772
+#define H 5
int btoi(int buf[16], int bufl) {
int num = 0;
@@ -18,73 +12,76 @@ int btoi(int buf[16], int bufl) {
return num;
}
-uint64_t part1(int numbers[H][W], int x, char c) {
+uint64_t part1(int numbers[H][W], int x, char op) {
uint64_t num = 0;
for (int dy=0;dy<H;++dy) {
if (numbers[dy][x]==0) continue;
- if (c=='*') num = (num==0?1:num) * numbers[dy][x];
- if (c=='+') num += numbers[dy][x];
+ if (op=='*') num = (num==0?1:num) * numbers[dy][x];
+ if (op=='+') num += numbers[dy][x];
}
return num;
}
-void align(char symbols[DIG]) {
- if (symbols[DIG-1]!=0) return;
- int cur = DIG-1;
- for (int i=DIG-1;i>=0;--i) {
- if (symbols[i]!=0) {
- symbols[cur--] = symbols[i];
- symbols[i] = 0;
+uint64_t part2(char digits[H][W], int ymax, int x1, int x2, char op) {
+ uint64_t res = op=='*'?1:0;
+ for (int x=x1;x<x2;++x) {
+ int buf[4] = {0};
+ int bufl = 0;
+ for (int y=0;y<ymax;++y) {
+ if (digits[y][x]!='0')
+ buf[bufl++] = digits[y][x]-'0';
+ }
+ int num = btoi(buf, bufl);
+ if (num>0) {
+ if (op=='+') res += num;
+ if (op=='*') res *= num;
}
}
-}
-
-uint64_t part2(Number digits[H][W], int x, char c) {
- uint64_t num = 0;
- for (int y=0;y<H;++y) {
- printf("%c",digits[y][x].symbols[DIG-1]);
- //for (int d=DIG-1;d>=0;--d) {
- // Number n = digits[y][x];
- //printf("%2c",n.symbols[d]>0?n.symbols[d]:'0');
- //}
- //printf("\n");
- }
- printf("\n");
- (void)c;
- return num;
+ return res;
}
int main(void) {
int numbers[H][W] = {0};
- Number digits[H][W] = {0};
+ char digits[H][W] = {0};
int x = 0;
+ int xx = 0;
+ int x1 = 0;
int y = 0;
int buf[8] = {0};
int bufl = 0;
uint64_t p1 = 0;
uint64_t p2 = 0;
+ int pc = 0;
for (int c=getchar();c!=EOF;c=getchar()) {
if (c>='0'&&c<='9') {
buf[bufl++] = c-'0';
- digits[y][x].symbols[digits[y][x].len++]=c;
+ digits[y][xx++] = c;
} else if (c==' '||c=='\n') {
if (bufl!=0) {
numbers[y][x] = btoi(buf, bufl);
- align(digits[y][x].symbols);
bufl = 0;
x++;
}
if (c=='\n') {
+ if (pc!=0) { // I'm tired today
+ p2 += part2(digits, y, x1, xx, pc);
+ }
y++;
x = 0;
+ xx= 0;
+ } else {
+ digits[y][xx] = '0';
+ xx++;
}
} else if (c=='*'||c=='+') {
p1 += part1(numbers, x, c);
- p2 += part2(digits, x, c);
+ p2 += part2(digits, y, x1, xx, pc);
+ pc = c;
+ x1 = xx;
x++;
+ xx++;
}
}
printf("p1: %"PRIu64"\np2: %"PRIu64"\n", p1, p2);
return 0;
}
-// 540238937 wrong