Advertisement
quetzelcoatlus

15a.c

Dec 15th, 2022 (edited)
927
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX(x, y) (((x) > (y)) ? (x) : (y))
  5.  
  6. #define MAX_SENSORS 25
  7. #define QUESTION_Y 2000000
  8.  
  9. int compare_ranges(const void *r1, const void *r2){
  10.     int a1 = *(int *)r1;
  11.     int b1 = *(int *)(r1+sizeof(int));
  12.     int a2 = *(int *)r2;
  13.     int b2 = *(int *)(r2+sizeof(int));
  14.     if(a1 < a2) return -1;
  15.     if(a1 == a2) return b1-b2;
  16.     return 1;
  17. }
  18.  
  19. void main(){
  20.     int range[MAX_SENSORS][2], r=0;
  21.     int beacon[MAX_SENSORS], b=0;
  22.  
  23.     int sx,sy,bx,by,dist,found,i;
  24.     while(scanf("Sensor at x=%d, y=%d: closest beacon is at x=%d, y=%d\n",&sx,&sy,&bx,&by) == 4){
  25.         dist=abs(sx-bx)+abs(sy-by);
  26.         if(dist>=abs(sy-QUESTION_Y)){
  27.             range[r][0]=sx-(dist-abs(sy-QUESTION_Y));
  28.             range[r++][1]=sx+(dist-abs(sy-QUESTION_Y));
  29.         }
  30.         if(by == QUESTION_Y) {
  31.             for(found=0,i=0;i<b;i++) if(beacon[i]==bx) found=1;
  32.             if(!found) beacon[b++]=bx;
  33.         }
  34.     }
  35.  
  36.     qsort(range,r,sizeof(int)*2,compare_ranges);
  37.  
  38.     for(i=0; i<r-1;i++){ //merge overlaping ranges
  39.         if(range[i+1][0] >= range[i][0] && range[i+1][0] <= range[i][1]){
  40.             range[i+1][0]=range[i][0];
  41.             range[i+1][1]=MAX(range[i][1],range[i+1][1]);
  42.             range[i][0]=0;
  43.             range[i][1]=-1;
  44.         }
  45.     }
  46.  
  47.     int sum=0;
  48.     for(i=0;i<r;i++){
  49.         sum+=range[i][1]-range[i][0]+1;
  50.         for(int j=0;j<b;j++) if(beacon[j]>=range[i][0] && beacon[j]<=range[i][1]) sum--;
  51.     }
  52.  
  53.     printf("Sum = %d\n",sum);
  54. }
Tags: adventofcode
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement