#include #include #include // Find badges for part 2 char find_badge(char group[3][50]) { for (int i = 0; i < strlen(group[0]); i++) { for (int j = 0; j < strlen(group[1]); j++) { for (int k = 0; k < strlen(group[2]); k++) { if (group[0][i] == group[1][j] && group[1][j] == group[2][k]) { return group[0][i]; } } } } return 0; } // Find items for part 1 char find_item(char *items) { int len = strlen(items); int mid = len / 2; for (int i = 0; i < mid; i++) { for (int j = mid; j < len; j++) { if (items[i] == items[j]) { return items[i]; } } } return 0; } // Updates item_sum / badge_sum when match is found void update_sum(const char c, int *sum) { if (c > 64 && c < 91) { *sum += c - 38; } else if (c > 96 && c < 123) { *sum += c - 96; } } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "USAGE: %s input_file\n", argv[0]); return 1; } FILE *file = fopen(argv[1], "r"); if (!file) { perror("fopen"); return 1; } char items[50] = {0}; char group[3][50] = {0}; int item_sum = 0, badge_sum = 0, idx = 0; while (fgets(items, sizeof items / sizeof *items, file) != NULL) { if (strlen(items) == 1) { break; } // Part 1 - find misplaced items items[strlen(items) - 1] = '\0'; char match = find_item(items); if (!match) { fprintf(stderr, "Match not found: %s\n", items); } update_sum(match, &item_sum); // Part 2 - find badges among groups of 3 memcpy(group[idx], items, strlen(items)); idx++; if (idx == 3) { idx = 0; char badge = find_badge(group); if (!badge) { fprintf(stderr, "Badge not found among the following group:\n%s\n%s\n%s\n", group[0], group[1], group[2]); } update_sum(badge, &badge_sum); for (int i = 0; i < sizeof group / sizeof *group; i++) { memset(group[i], 0, sizeof group[0] / sizeof *group[0]); } } memset(items, 0, sizeof items / sizeof *items); } fclose(file); printf("Part 1 - Sum of item priorities: %d\n", item_sum); printf("Part 2 - Sum of badge priorities: %d\n", badge_sum); return 0; }