Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define SIZE 1175
- #define ITEM_COUNT 200
- #define COL 68
- #define INPUT_SIZE 15774
- struct order_t {
- int val1;
- int val2;
- };
- typedef struct order_t Order;
- void parse_inputs(FILE* file, int items[][COL], int* item_sizes, Order* rules) {
- {
- int index = 0;
- int val1;
- int val2;
- while (fscanf(file, "%d|%d", &val1, &val2) == 2) {
- Order item = { val1, val2 };
- rules[index++] = item;
- }
- }
- char buffer[COL];
- fgets(buffer, 3, file); // Just need to get an empty line
- {
- int index = 0;
- int offset = 1;
- char line[COL];
- int c;
- int val;
- while (fscanf(file, "%d", &val) == 1) {
- items[index][offset++] = val;
- if ((c = fgetc(file)) != 44) { // A comma (,)
- // End of this string of values
- item_sizes[index] = offset;
- index++;
- offset = 1;
- }
- }
- }
- }
- int find_order(int* val1, int* val2, Order* ordered) {
- for (size_t i = 0; i < 1175; i++) {
- Order item = *(ordered + i);
- if (item.val1 == *val1 && item.val2 == *val2) {
- // This is in the right order
- return 1;
- }
- else if (item.val1 == *val2 && item.val2 == *val1) {
- // This is in the wrong order
- return 0;
- }
- }
- //Nothing was found, so it's okay
- return 1;
- }
- int correct_line(int* items, int item_size, Order* ordered) {
- for (size_t i = 0; i < item_size; i++) {
- for (size_t j = i + 1; j < item_size; j++) {
- if (!find_order(items + i, items + j, ordered)) {
- return 0;
- }
- }
- }
- return 1;
- }
- int part_one(int items[][COL], int* item_sizes, int size, Order* ordered) {
- int total = 0;
- for (size_t i = 0; i < size; i++) {
- int* item = *(items + i);
- int size = *(item_sizes + i);
- if (size == 0) {
- break;
- }
- if (!correct_line(item, size, ordered)) {
- continue;
- }
- total += *(item + size / 2);
- }
- return total;
- }
- // Assume to_index < first_index
- void move(int* array, int first_index, int to_index) {
- int original = *(array + first_index);
- for (size_t i = first_index; i > to_index; i--) {
- *(array + i) = *(array + i - 1);
- }
- *(array + to_index) = original;
- }
- void adjust_line(int* items, int item_size, Order* ordered) {
- int index = 0;
- while (index < item_size) {
- for (size_t j = index + 1; j < item_size; j++) {
- /*
- If it is in the wrong order, put the second one just before the first and reduce index by one
- */
- if (find_order(items + index, items + j, ordered)) {
- continue;
- }
- move(items, j, index);
- index--;
- break;
- }
- index++;
- }
- }
- int part_two(int items[][COL], int* item_sizes, int size, Order* ordered) {
- /*
- If it is in the wrong order, put the second one just before the first and reduce index by one
- */
- int total = 0;
- for (size_t i = 0; i < size; i++) {
- int* item = *(items + i);
- int size = *(item_sizes + i);
- if (size == 0) {
- break;
- }
- if (correct_line(item, size, ordered)) {
- continue;
- }
- adjust_line(item, size, ordered);
- total += *(item + size / 2);
- }
- return total;
- }
- int main() {
- FILE* ptr = fopen("2024-5.txt", "r");
- Order rules[SIZE];
- int items[ITEM_COUNT][COL];
- int sizes[ITEM_COUNT];
- parse_inputs(ptr, items, sizes, rules);
- printf("Part one: %d\n", part_one(items, sizes, ITEM_COUNT, rules));
- printf("Part two: %d\n", part_two(items, sizes, ITEM_COUNT, rules));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement