day03.c (1317B)
1 #define _GNU_SOURCE 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <inttypes.h> 6 #include <string.h> 7 #include "cputime.h" 8 9 static const uint64_t pow10[] = { 10 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12 11 }; 12 13 typedef struct { 14 int buf[100]; 15 int cnt; 16 } Buffer; 17 18 int find_max(int *buf, int len) { 19 int m = 0; 20 for (int i=0;i<len;++i) { 21 if (buf[i]>buf[m]) m=i; 22 } 23 return m; 24 } 25 26 int part1(Buffer *b) { 27 int i1 = find_max(b->buf, b->cnt-1); 28 int i2 = find_max(b->buf+i1+1, b->cnt-i1-1)+i1+1; 29 return b->buf[i1]*10+b->buf[i2]; 30 } 31 32 uint64_t part2(Buffer *b) { 33 uint64_t num = 0; 34 int li = -1; 35 int w = b->cnt-12; 36 for (int i=0;i<12;++i) { 37 int reserve = 12-i; 38 int offset = li+1; 39 w = b->cnt-(reserve+offset-1); 40 if (reserve==1) w = b->cnt-offset; 41 li = find_max(b->buf+offset, w) + offset; 42 num += b->buf[li]*pow10[12-i-1]; 43 } 44 return num; 45 } 46 47 int main(void) { 48 Buffer b = {0}; 49 int p1 = 0; 50 uint64_t p2 = 0; 51 for (int c=getchar();c!=EOF;c=getchar()) { 52 if (c>='0'&&c<='9') { 53 b.buf[b.cnt++] = c-'0'; 54 } else { 55 p1 += part1(&b); 56 p2 += part2(&b); 57 b.cnt = 0; 58 } 59 } 60 printf("p1: %d\np2: %"PRIu64"\n", p1, p2); 61 return 0; 62 }