day06.c (2182B)
1 #include <stdio.h> 2 #include <inttypes.h> 3 #include "cputime.h" 4 5 // tail -n1 inputs/day06.txt | sed 's/\s/\n/g'|sort|grep '+\|*'|wc -l 6 #define W 3772 7 #define H 5 8 9 int btoi(int bufl, int buf[bufl]) { 10 int num = 0; 11 for (int i=0;i<bufl;++i) num = num*10+buf[i]; 12 return num; 13 } 14 15 uint64_t part1(int numbers[H][W], int x, char op) { 16 uint64_t num = 0; 17 for (int dy=0;dy<H;++dy) { 18 if (numbers[dy][x]==0) continue; 19 if (op=='*') num = (num==0?1:num) * numbers[dy][x]; 20 if (op=='+') num += numbers[dy][x]; 21 } 22 return num; 23 } 24 25 uint64_t part2(char digits[H][W], int ymax, int x1, int x2, char op) { 26 uint64_t res = op=='*'?1:0; 27 for (int x=x1;x<x2;++x) { 28 int buf[4] = {0}; 29 int bufl = 0; 30 for (int y=0;y<ymax;++y) { 31 if (digits[y][x]!='0') 32 buf[bufl++] = digits[y][x]-'0'; 33 } 34 int num = btoi(bufl, buf); 35 if (num>0) { 36 if (op=='+') res += num; 37 if (op=='*') res *= num; 38 } 39 } 40 return res; 41 } 42 43 int main(void) { 44 int numbers[H][W] = {0}; 45 char digits[H][W] = {0}; 46 int x = 0; 47 int xx = 0; 48 int x1 = 0; 49 int y = 0; 50 int buf[8] = {0}; 51 int bufl = 0; 52 uint64_t p1 = 0; 53 uint64_t p2 = 0; 54 int pc = 0; 55 for (int c=getchar();c!=EOF;c=getchar()) { 56 if (c>='0'&&c<='9') { 57 buf[bufl++] = c-'0'; 58 digits[y][xx++] = c; 59 } else if (c==' '||c=='\n') { 60 if (bufl!=0) { 61 numbers[y][x] = btoi(bufl, buf); 62 bufl = 0; 63 x++; 64 } 65 if (c=='\n') { 66 if (pc!=0) { // I'm tired today 67 p2 += part2(digits, y, x1, xx, pc); 68 } 69 y++; 70 x = 0; 71 xx= 0; 72 } else { 73 digits[y][xx] = '0'; 74 xx++; 75 } 76 } else if (c=='*'||c=='+') { 77 p1 += part1(numbers, x, c); 78 p2 += part2(digits, y, x1, xx, pc); 79 pc = c; 80 x1 = xx; 81 x++; 82 xx++; 83 } 84 } 85 printf("p1: %"PRIu64"\np2: %"PRIu64"\n", p1, p2); 86 return 0; 87 }