uppga.c (1254B)
1 #include "common.h" 2 3 static inline int is_digit(char x) { return '0' <= x && x <= '9'; } 4 5 static inline int is_symbol(char x) { return x != '.' && !is_digit(x); } 6 7 static int has_adjacent_symbol(char **lines, const size_t i, const size_t j, 8 const size_t nrows, const size_t ncols) { 9 coordinate_t n[9]; 10 nbrs(n, i, j, nrows, ncols); 11 12 size_t nbr_i = 0; 13 while (is_defined(n[nbr_i])) { 14 if (is_symbol(lines[n[nbr_i].y][n[nbr_i].x])) 15 return 1; 16 nbr_i++; 17 } 18 19 return 0; 20 } 21 22 int main(int argc, char **argv) { 23 char **lines; 24 size_t nlines = readlines(&lines, "input"); 25 size_t cols = strlen(lines[0]) - 1; 26 27 uint64_t sum = 0; 28 size_t i, j; 29 int in_number = 0; 30 uint64_t cnum = 0; 31 int symbolic = 0; 32 for (i = 0; i < nlines; i++) { 33 for (j = 0; j < cols; j++) { 34 if (is_digit(lines[i][j])) { 35 in_number = 1; 36 if (has_adjacent_symbol(lines, i, j, nlines, cols)) { 37 symbolic = 1; 38 } 39 cnum = cnum * 10 + ((int)(lines[i][j] - '0')); 40 } else { 41 if (in_number) { 42 if (symbolic) { 43 sum += cnum; 44 } 45 in_number = 0; 46 cnum = 0; 47 symbolic = 0; 48 } 49 } 50 } 51 } 52 53 printf("%llu\n", sum); 54 }