aocc22

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

common.c (1098B)


      1 #include "common.h"
      2 
      3 uint64_t parse(int *boundaries, char *dirs, uint64_t *times, char **lines,
      4                size_t nlines) {
      5   uint64_t tot = 0;
      6   int cp[2] = {0, 0};
      7   bzero(boundaries, sizeof(*boundaries) * 4);
      8 
      9   size_t i;
     10   for (i = 0; i < nlines; i++) {
     11     uint64_t tmp;
     12     sread_next_u64(&tmp, lines[i]);
     13     dirs[i] = lines[i][0];
     14     times[i] = tmp;
     15     tot += tmp;
     16 
     17     if (lines[i][0] == 'R')
     18       cp[0] += tmp;
     19     else if (lines[i][0] == 'L')
     20       cp[0] -= tmp;
     21     else if (lines[i][0] == 'U')
     22       cp[1] += tmp;
     23     else if (lines[i][0] == 'D')
     24       cp[1] -= tmp;
     25     if (cp[0] < boundaries[0])
     26       boundaries[0] = cp[0];
     27     if (cp[0] > boundaries[1])
     28       boundaries[1] = cp[0];
     29     if (cp[1] < boundaries[2])
     30       boundaries[2] = cp[1];
     31     if (cp[1] > boundaries[3])
     32       boundaries[3] = cp[1];
     33   }
     34 
     35   return tot;
     36 }
     37 
     38 uint64_t diagon(int *pos, int *boundaries) {
     39   uint64_t xpos = (uint64_t)(pos[0] - boundaries[0]);
     40   uint64_t ypos = (uint64_t)(pos[1] - boundaries[2]);
     41   uint64_t xdim = (uint64_t)(1 + boundaries[1] - boundaries[0]);
     42   return ypos * xdim + xpos;
     43 }