aocc23

Advent of Code 2023
git clone git://www.tkruger.se/aocc23.git
Log | Files | Refs | README

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 }