Advertisement
BlueRains

AdventOfCode C 2024 day 5

Dec 5th, 2024
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.90 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define SIZE 1175
  4. #define ITEM_COUNT 200
  5. #define COL 68
  6. #define INPUT_SIZE 15774
  7.  
  8. struct order_t {
  9.     int val1;
  10.     int val2;
  11. };
  12.  
  13. typedef struct order_t Order;
  14.  
  15.  
  16. void parse_inputs(FILE* file, int items[][COL], int* item_sizes, Order* rules) {
  17.     {
  18.         int index = 0;
  19.         int val1;
  20.         int val2;
  21.         while (fscanf(file, "%d|%d", &val1, &val2) == 2) {
  22.             Order item = { val1, val2 };
  23.             rules[index++] = item;
  24.         }
  25.     }
  26.     char buffer[COL];
  27.     fgets(buffer, 3, file); // Just need to get an empty line
  28.     {
  29.         int index = 0;
  30.         int offset = 1;
  31.         char line[COL];
  32.         int c;
  33.         int val;
  34.         while (fscanf(file, "%d", &val) == 1) {
  35.             items[index][offset++] = val;
  36.             if ((c = fgetc(file)) != 44) { // A comma (,)
  37.                 // End of this string of values
  38.                 item_sizes[index] = offset;
  39.                 index++;
  40.                 offset = 1;
  41.             }
  42.         }
  43.     }
  44.  
  45. }
  46.  
  47.  
  48. int find_order(int* val1, int* val2, Order* ordered) {
  49.     for (size_t i = 0; i < 1175; i++) {
  50.         Order item = *(ordered + i);
  51.         if (item.val1 == *val1 && item.val2 == *val2) {
  52.             // This is in the right order
  53.             return 1;
  54.         }
  55.         else if (item.val1 == *val2 && item.val2 == *val1) {
  56.             // This is in the wrong order
  57.             return 0;
  58.         }
  59.     }
  60.     //Nothing was found, so it's okay
  61.     return 1;
  62. }
  63.  
  64. int correct_line(int* items, int item_size, Order* ordered) {
  65.     for (size_t i = 0; i < item_size; i++) {
  66.         for (size_t j = i + 1; j < item_size; j++) {
  67.             if (!find_order(items + i, items + j, ordered)) {
  68.                 return 0;
  69.             }
  70.         }
  71.     }
  72.     return 1;
  73. }
  74.  
  75. int part_one(int items[][COL], int* item_sizes, int size, Order* ordered) {
  76.     int total = 0;
  77.     for (size_t i = 0; i < size; i++) {
  78.         int* item = *(items + i);
  79.         int size = *(item_sizes + i);
  80.         if (size == 0) {
  81.             break;
  82.         }
  83.         if (!correct_line(item, size, ordered)) {
  84.             continue;
  85.         }
  86.         total += *(item + size / 2);
  87.     }
  88.     return total;
  89. }
  90. // Assume to_index < first_index
  91. void move(int* array, int first_index, int to_index) {
  92.     int original = *(array + first_index);
  93.     for (size_t i = first_index; i > to_index; i--) {
  94.         *(array + i) = *(array + i - 1);
  95.     }
  96.     *(array + to_index) = original;
  97. }
  98.  
  99. void adjust_line(int* items, int item_size, Order* ordered) {
  100.     int index = 0;
  101.     while (index < item_size) {
  102.         for (size_t j = index + 1; j < item_size; j++) {
  103.             /*
  104.                 If it is in the wrong order, put the second one just before the first and reduce index by one
  105.              */
  106.             if (find_order(items + index, items + j, ordered)) {
  107.                 continue;
  108.             }
  109.             move(items, j, index);
  110.             index--;
  111.             break;
  112.         }
  113.         index++;
  114.     }
  115. }
  116.  
  117. int part_two(int items[][COL], int* item_sizes, int size, Order* ordered) {
  118.     /*
  119.     If it is in the wrong order, put the second one just before the first and reduce index by one
  120.      */
  121.     int total = 0;
  122.     for (size_t i = 0; i < size; i++) {
  123.         int* item = *(items + i);
  124.         int size = *(item_sizes + i);
  125.         if (size == 0) {
  126.             break;
  127.         }
  128.         if (correct_line(item, size, ordered)) {
  129.             continue;
  130.         }
  131.         adjust_line(item, size, ordered);
  132.         total += *(item + size / 2);
  133.     }
  134.     return total;
  135. }
  136. int main() {
  137.     FILE* ptr = fopen("2024-5.txt", "r");
  138.     Order rules[SIZE];
  139.     int items[ITEM_COUNT][COL];
  140.     int sizes[ITEM_COUNT];
  141.     parse_inputs(ptr, items, sizes, rules);
  142.     printf("Part one: %d\n", part_one(items, sizes, ITEM_COUNT, rules));
  143.     printf("Part two: %d\n", part_two(items, sizes, ITEM_COUNT, rules));
  144. }
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement