advent2025

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

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:
Mday06.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