#include #include #include #include "../../lib/aoc.h" typedef struct Compartment { char contents[52]; } Compartment; void print_compartment(Compartment *c) { for (char i = 'a'; i <= 'z'; i++) { printf("%c", i); } for (char i = 'A'; i <= 'Z'; i++) { printf("%c", i); } printf("\n"); for (char i = 0; i < 52; i++) { printf("%d", c->contents[i]); } printf("\n\n"); } Compartment fill_compartment(const char *half) { Compartment compartment; for (char i = 0; i < 52; i++) { compartment.contents[i] = 0; } for (int i = 0; i < strlen(half); i++) { char c = half[i]; if (c >= 'a' && c <= 'z') { compartment.contents[c - 'a'] = 1; } else { compartment.contents[c - 'A' + 26] = 1; } } fflush(stdout); return compartment; } int priority(char *line) { int len = strlen(line); char *second = malloc((len / 2) + 1); strcpy(second, line + (len / 2)); line[len / 2] = '\0'; Compartment c1 = fill_compartment(line); Compartment c2 = fill_compartment(second); // print_compartment(&c1); // print_compartment(&c2); for (int i = 0; i < 52; i++) { if (c1.contents[i] && c2.contents[i]) { free(second); return i + 1; } } free(second); return 0; } int three_line_priority(char *one, char *two, char *three) { Compartment c1 = fill_compartment(one); Compartment c2 = fill_compartment(two); Compartment c3 = fill_compartment(three); for (int i = 0; i < 52; i++) { if (c1.contents[i] && c2.contents[i] && c3.contents[i]) { return i + 1; } } return 0; } int main() { char *line; int sum = 0; while ((line = aoc_read_line()) != NULL) { sum += priority(line); } aoc_reset_read_line(); int three_line_sum = 0; char *line_1, *line_2, *line_3; while ( (line_1 = aoc_read_line()) != NULL && (line_2 = aoc_read_line()) != NULL && (line_3 = aoc_read_line()) != NULL ) { three_line_sum += three_line_priority(line_1, line_2, line_3); } printf("Part 1: %d\n", sum); printf("Part 2: %d\n", three_line_sum); aoc_free(); return 0; }