diff --git a/c/2022/3/problem.c b/c/2022/3/problem.c index 5812313..164041d 100644 --- a/c/2022/3/problem.c +++ b/c/2022/3/problem.c @@ -63,6 +63,20 @@ int priority(char *line) { 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; @@ -71,7 +85,20 @@ int main() { 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; diff --git a/c/lib/aoc.h b/c/lib/aoc.h index f8fe1e9..f5f3118 100644 --- a/c/lib/aoc.h +++ b/c/lib/aoc.h @@ -23,12 +23,17 @@ char *aoc_read_input(void) { return input_buffer; } +char *read_line_buffer = NULL; char *seek = NULL; char *aoc_read_line(void) { if (input_buffer == NULL) aoc_read_input(); + if (read_line_buffer == NULL) { + read_line_buffer = malloc(strlen(input_buffer) + 1); + strcpy(read_line_buffer, input_buffer); + } - if (seek == NULL) seek = input_buffer; + if (seek == NULL) seek = read_line_buffer; char *line_break = strstr(seek, "\n"); if (line_break == NULL) return NULL; @@ -39,6 +44,12 @@ char *aoc_read_line(void) { return token; } +void aoc_reset_read_line(void) { + strcpy(read_line_buffer, input_buffer); + seek = NULL; +} + void aoc_free(void) { free(input_buffer); + free(read_line_buffer); }