aocc23

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

common.c (731B)


      1 #include "common.h"
      2 
      3 void read_data(stack_u64 *times, stack_u64 *distances, char **lines,
      4                size_t nlines) {
      5   char *cp = lines[0];
      6   uint64_t t;
      7 
      8   while ((cp = sread_next_u64(&t, cp)) != NULL) {
      9     stack_u64_push(times, t);
     10   }
     11 
     12   cp = lines[1];
     13   while ((cp = sread_next_u64(&t, cp)) != NULL) {
     14     stack_u64_push(distances, t);
     15   }
     16 }
     17 
     18 uint64_t counter(uint64_t t, uint64_t d) {
     19   if (t * t < 4 * d)
     20     return 0;
     21 
     22   uint64_t r = t * t - 4 * d;
     23   long double rr = sqrtl((long double)r);
     24 
     25   uint64_t lb = (uint64_t)floorl(((long double)t - rr) / 2);
     26   uint64_t ub = (uint64_t)ceill(((long double)t + rr) / 2);
     27 
     28   while (lb * (t - lb) <= d)
     29     lb++;
     30 
     31   while (ub * (t - ub) <= d)
     32     ub--;
     33 
     34   return ub - lb + 1;
     35 }