BlueRains

AdventOfCode C 2024 day 8

Dec 8th, 2024
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #define WIDTH 50
  4. #define SIZE 250
  5.  
  6.  
  7. struct point_t {
  8.     int x;
  9.     int y;
  10. };
  11.  
  12. typedef struct point_t Point;
  13.  
  14. struct antenna_t {
  15.     Point point;
  16.     char type;
  17. };
  18. typedef struct antenna_t Antenna;
  19.  
  20. Point distance(Point point1, Point point2) {
  21.     int x = point1.x - point2.x;
  22.     int y = point1.y - point2.y;
  23.     Point res = { x,y };
  24.     return res;
  25. }
  26.  
  27. Point add(Point point1, Point point2) {
  28.     int x = point1.x + point2.x;
  29.     int y = point1.y + point2.y;
  30.     Point res = { x,y };
  31.     return res;
  32. }
  33.  
  34. bool in_range(Point point) {
  35.     return point.x >= 0 && point.x < WIDTH && point.y >= 0 && point.y < WIDTH;
  36. }
  37.  
  38. /**
  39.  * @brief Parse input
  40.  * @note
  41.  * @param  file: The file to parse
  42.  * @param  antennas: The array to put the antennas in
  43.  * @retval How many antennas were found
  44.  */
  45. int parse(FILE* file, Antenna* antennas) {
  46.     int index = 0;
  47.     int y = 0;
  48.     int x = 0;
  49.     char val;
  50.     while ((val = fgetc(file)) != EOF) {
  51.         if (val == '\n') {
  52.             // End of this string of values
  53.             y++;
  54.             x = -1;
  55.         }
  56.         else if (val != '.' && val != '#') {
  57.             Antenna temp = { x, y, val };
  58.             printf("Antenna found at %d, %d: %c\n", x, y, val);
  59.             antennas[index] = temp;
  60.             index++;
  61.         }
  62.         x++;
  63.     }
  64.     return index;
  65. }
  66.  
  67. void print_map(Antenna* antennas, int antenna_size, Point* points, int point_size) {
  68.     char items[WIDTH + 1][WIDTH];
  69.     for (size_t i = 0; i < WIDTH; i++) {
  70.         for (size_t j = 0; j < WIDTH; j++) {
  71.             items[i][j] = '.';
  72.         }
  73.         items[i][WIDTH] = '\n';
  74.     }
  75.     for (size_t i = 0; i < point_size; i++) {
  76.         Point point = *(points + i);
  77.         items[point.y][point.x] = '#';
  78.     }
  79.     for (size_t i = 0; i < antenna_size; i++) {
  80.         Antenna antenna = *(antennas + i);
  81.         items[antenna.point.y][antenna.point.x] = antenna.type;
  82.     }
  83.     for (size_t i = 0; i < WIDTH; i++) {
  84.         for (size_t j = 0; j < WIDTH; j++) {
  85.             printf("%c", items[i][j]);
  86.             /* code */
  87.         }
  88.         printf("\n");
  89.     }
  90. }
  91.  
  92. /**
  93.  * @brief  Get the antinodes for these antenna, according to part 1
  94.  * @note
  95.  * @param  antenna1: The first antenna
  96.  * @param  antenna2: The second antenna
  97.  * @param  save_place: The location to put the point(s)
  98.  * @retval How many hotspots were found in range
  99.  */
  100. int get_hotspots_p1(Antenna* antenna1, Antenna* antenna2, Point* save_place) {
  101.     printf("Hotspots between %d,%d and %d, %d: ", antenna1->point.x, antenna1->point.y, antenna2->point.x, antenna2->point.y);
  102.     if (antenna1->type != antenna2->type) {
  103.         printf("0\n");
  104.         return 0;
  105.     }
  106.     int index = 0;
  107.     Point dist = distance(antenna1->point, antenna2->point);
  108.     Point hotspot_1 = add(antenna1->point, dist);
  109.     if (in_range(hotspot_1)) {
  110.         printf(" (%d,%d)", hotspot_1.x, hotspot_1.y);
  111.         *save_place = hotspot_1;
  112.         index++;
  113.     }
  114.     Point neg_dist = { -dist.x, -dist.y };
  115.     Point hotspot_2 = add(antenna2->point, neg_dist);
  116.     if (in_range(hotspot_2)) {
  117.         printf(" (%d,%d)", hotspot_2.x, hotspot_2.y);
  118.         *(save_place + index) = hotspot_2;
  119.         index++;
  120.     }
  121.     printf("\n");
  122.     return index;
  123. }
  124.  
  125. int part_one(Antenna* antennas, int size) {
  126.     Point points[SIZE * 2];
  127.     int index = 0;
  128.     // Compare all,
  129.     for (size_t i = 0; i < size; i++) {
  130.         Antenna* antenna1 = antennas + i;
  131.         int same = 0;
  132.         int found = 0;
  133.         for (size_t j = 0; j < size; j++) {
  134.             if (i == j) {
  135.                 continue;
  136.             }
  137.             Antenna* antenna2 = antennas + j;
  138.             if (antenna1->type != antenna2->type) {
  139.                 continue;
  140.             }
  141.             same++;
  142.             if (j <= i) {
  143.                 continue;
  144.             }
  145.             int addition = get_hotspots_p1(antenna1, antenna2, points + index);
  146.             index += addition;
  147.             found += addition;
  148.         }
  149.         if (same == 0) {
  150.             printf("%c only has 1 antenna on the map\n", antenna1->type);
  151.             // It's the only one of it's type. That means a antinode is at it's point.
  152.             points[index] = antenna1->point;
  153.             index++;
  154.         }
  155.         printf("%c (%d,%d) has %d resonance spots\n", antenna1->type, antenna1->point.x, antenna1->point.y, found);
  156.     }
  157.     // Filter them into unique points;
  158.     Point uniques[SIZE * 2];
  159.     int unique_index = 0;
  160.     for (size_t i = 0; i < index; i++) {
  161.         Point known = *(points + i);
  162.         bool found = false;
  163.         for (size_t j = 0; j < unique_index; j++) {
  164.             Point unique = *(uniques + j);
  165.             if (known.x == unique.x && known.y == unique.y) {
  166.                 found = true;
  167.                 break;
  168.             }
  169.         }
  170.         if (!found) {
  171.             uniques[unique_index] = known;
  172.             unique_index++;
  173.         }
  174.     }
  175.     print_map(antennas, size, uniques, unique_index);
  176.     return unique_index;
  177. }
  178.  
  179. /**
  180.  * @brief  Get the antinodes for these antenna, according to part 1
  181.  * @note
  182.  * @param  antenna1: The first antenna
  183.  * @param  antenna2: The second antenna
  184.  * @param  save_place: The location to put the point(s)
  185.  * @retval How many hotspots were found in range
  186.  */
  187. int get_hotspots_p2(Antenna* antenna1, Antenna* antenna2, Point* save_place) {
  188.     printf("Hotspots between %d,%d and %d, %d:", antenna1->point.x, antenna1->point.y, antenna2->point.x, antenna2->point.y);
  189.     if (antenna1->type != antenna2->type) {
  190.         printf("0\n");
  191.         return 0;
  192.     }
  193.     int index = 0;
  194.     Point dist = distance(antenna1->point, antenna2->point);
  195.     Point neg_dist = { -dist.x, -dist.y };
  196.  
  197.     Point hotspot_1 = add(antenna1->point, dist);
  198.     while (in_range(hotspot_1)) {
  199.         // Go to the first extreme edge
  200.         hotspot_1 = add(hotspot_1, dist);
  201.     };
  202.     hotspot_1 = add(hotspot_1, neg_dist);
  203.     printf(" start %d,%d", hotspot_1.x, hotspot_1.y);
  204.     while (in_range(hotspot_1)) {
  205.         printf(" (%d,%d)", hotspot_1.x, hotspot_1.y);
  206.         *(save_place + index) = hotspot_1;
  207.         index++;
  208.         hotspot_1 = add(hotspot_1, neg_dist);
  209.     };
  210.  
  211.     printf("\n");
  212.     return index;
  213. }
  214.  
  215. int part_two(Antenna* antennas, int size) {
  216.     Point points[SIZE * 10];
  217.     int index = 0;
  218.     // Compare all,
  219.     for (size_t i = 0; i < size; i++) {
  220.         Antenna* antenna1 = antennas + i;
  221.         int same = 0;
  222.         int found = 0;
  223.         for (size_t j = 0; j < size; j++) {
  224.             if (i == j) {
  225.                 continue;
  226.             }
  227.             Antenna* antenna2 = antennas + j;
  228.             if (antenna1->type != antenna2->type) {
  229.                 continue;
  230.             }
  231.             same++;
  232.             if (j <= i) {
  233.                 continue;
  234.             }
  235.             int addition = get_hotspots_p2(antenna1, antenna2, points + index);
  236.             index += addition;
  237.             found += addition;
  238.         }
  239.         if (same == 0) {
  240.             printf("%c only has 1 antenna on the map\n", antenna1->type);
  241.             // It's the only one of it's type. That means a antinode is at it's point.
  242.             points[index] = antenna1->point;
  243.             index++;
  244.         }
  245.         printf("%c (%d,%d) has %d resonance spots\n", antenna1->type, antenna1->point.x, antenna1->point.y, found);
  246.     }
  247.     // Filter them into unique points;
  248.     Point uniques[SIZE * 10];
  249.     int unique_index = 0;
  250.     for (size_t i = 0; i < index; i++) {
  251.         Point known = *(points + i);
  252.         bool found = false;
  253.         for (size_t j = 0; j < unique_index; j++) {
  254.             Point unique = *(uniques + j);
  255.             if (known.x == unique.x && known.y == unique.y) {
  256.                 found = true;
  257.                 break;
  258.             }
  259.         }
  260.         if (!found) {
  261.             uniques[unique_index] = known;
  262.             unique_index++;
  263.         }
  264.     }
  265.     print_map(antennas, size, uniques, unique_index);
  266.     return unique_index;
  267. }
  268.  
  269. int main() {
  270.     FILE* ptr = fopen("2024-8.txt", "r");
  271.     Antenna antennas[SIZE];
  272.     int size = parse(ptr, antennas);
  273.     printf("%d antennas found!\n", size);
  274.     printf("Part one: %d\n", part_one(antennas, size));
  275.     printf("Part two: %d\n", part_two(antennas, size));
  276. }
  277.  
  278. //1085: too low
Advertisement
Add Comment
Please, Sign In to add comment