Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- int main(){
- FILE *fptr = fopen("/media/int_drive/Development/c/AoC/2024/05/input.txt", "r");
- if (fptr == NULL) { printf("Failed to open the input file"); return 1; };
- // Count number of rules and updates
- int rctr = 0, uctr = 0;
- char buf[1024];
- while(fgets(buf, sizeof(buf), fptr)){ if (strchr(buf, '|')){ ++rctr; } else if (strchr(buf, ',') ) { ++uctr; }; };
- printf("Rules: %d Updates: %d\n", rctr, uctr);
- // Reseting position in file
- rewind(fptr);
- // Creating arrays to store rules pairs
- int rarr1[rctr], rarr2[rctr];
- // Parsing rules into arrays
- int num1 = 0, num2 = 0, index = 0;
- while(fscanf(fptr, "%d|%d", &num1, &num2) == 2){ rarr1[index] = num1; rarr2[index] = num2; ++index; };
- fseek(fptr, 6*sizeof(char)*rctr, SEEK_SET); // Skipping empty line
- // Parsing updates into 2D array
- int uarr[uctr][23], uarr_bad[uctr];
- int nums[23] = {0}, bad_index = 0;
- index = 0;
- while(fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &nums[0], &nums[1], &nums[2], &nums[3], &nums[4], &nums[5], &nums[6], &nums[7],
- &nums[8], &nums[9], &nums[10], &nums[11], &nums[12], &nums[13], &nums[14], &nums[15],
- &nums[16], &nums[17], &nums[18], &nums[19], &nums[20], &nums[21], &nums[22]) > 0){
- for (int i = 0; i < 23; ++i){uarr[index][i] = nums[i]; };
- ++index;
- memset(nums, 0, 23 * sizeof(int)); // Reset nums values to 0
- };
- fclose(fptr);
- // Print parsing results
- // for (int i = 0; i < rctr; ++i){ printf("%d|%d\n", rarr1[i], rarr2[i]); }; putchar('\n');
- // for (int i = 0; i < uctr; ++i){ for (int j = 0; j < 23; ++j){printf("%d, ", uarr[i][j]); }; putchar('\n'); };
- // PART 1
- int mid_sum = 0;
- // Go rule one by one and check if second number is before first
- for (int i = 0; i < uctr; ++i){ // updates row
- int good = 1;
- for (int j = 0; j < 23; ++j){ // updates elements
- if (uarr[i][j] == 0){ break; }; // go to next row if 0
- for (int k = 0; k < rctr; ++k){ // check each rule
- if (uarr[i][j] == rarr1[k]){ // compare update number to current rule number
- //printf("Testing rule: %d|%d on update #%d\n", rarr1[k], rarr2[k], i+1);
- for (int l = 0; l < j; ++l){
- if (uarr[i][l] == 0){break; };
- if (uarr[i][l] == rarr2[k]){good = 0; break;}; // if second rule number is before current number then report bad
- };
- };
- };
- };
- if (good){ // Add middle number to the sum
- int last_num_index = 0;
- for (int m = 0; m < 23; ++m){ if (uarr[i][m] != 0){++last_num_index;}; };
- mid_sum += uarr[i][last_num_index / 2];
- //printf("Update #%d is good. Middle index: %d\n", i+1, last_num_index / 2);
- } else {uarr_bad[bad_index++] = i; };
- };
- printf("Sum of middle numbers of good reports: %d\n", mid_sum);
- printf("Number of bad reportes reports: %d\n", bad_index);
- // PART 2
- mid_sum = 0;
- int while_index = 0;
- // Go rule one by one and check if second number is before first
- for (int i = 0; i < bad_index; ++i){ // updates row
- int bad = 1;
- for (int j = 0; j < 23; ++j){ // updates elements
- if (uarr[uarr_bad[i]][j] == 0){ break; }; // go to next row if 0
- for (int k = 0; k < rctr; ++k){ // check each rule
- if (uarr[uarr_bad[i]][j] == rarr1[k]){ // compare update number to current rule number
- for (int l = 0; l < j; ++l){
- if (uarr[uarr_bad[i]][l] == 0){bad = 0; break; };
- if (uarr[uarr_bad[i]][l] == rarr2[k]){ // if second rule number is before current number just swap them
- int temp = uarr[uarr_bad[i]][j];
- uarr[uarr_bad[i]][j] = uarr[uarr_bad[i]][l];
- uarr[uarr_bad[i]][l] = temp;
- //printf("After swap: %d, %d, %d, %d, %d\n", uarr[uarr_bad[i]][0], uarr[uarr_bad[i]][1], uarr[uarr_bad[i]][2], uarr[uarr_bad[i]][3], uarr[uarr_bad[i]][4]);
- j = 0; // Go back untill fixed
- break;
- };
- };
- };
- };
- };
- int last_num_index = 0;
- for (int m = 0; m < 23; ++m){ if (uarr[uarr_bad[i]][m] != 0){++last_num_index;}; };
- mid_sum += uarr[uarr_bad[i]][last_num_index / 2];
- //printf("Update #%d is good. Middle index: %d (%d) | %d %d %d %d %d \n", i+1, last_num_index / 2, uarr[uarr_bad[i]][last_num_index / 2],
- // uarr[uarr_bad[i]][0], uarr[uarr_bad[i]][1], uarr[uarr_bad[i]][2], uarr[uarr_bad[i]][3], uarr[uarr_bad[i]][4]);
- };
- printf("Sum of middle numbers of previously bad reports: %d\n", mid_sum);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement