From f71ba6fb32242cf41353bcb6f8b8ae87052dac80 Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Thu, 5 Dec 2024 01:07:31 -0500 Subject: [PATCH] c 2024 day 5 part 1 --- c/2024/5/print_queue.c | 83 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 c/2024/5/print_queue.c diff --git a/c/2024/5/print_queue.c b/c/2024/5/print_queue.c new file mode 100644 index 0000000..5819999 --- /dev/null +++ b/c/2024/5/print_queue.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include + +#include "../../lib/aoc.h" + +typedef struct Rule { + int first; + int last; +} Rule; + +typedef struct Rules { + Rule rule[1200]; + int length; +} Rules; + +typedef struct Update { + int page[100]; + int length; +} Update; + +bool valid_rule(Rule *rule, Update *update) { + int first = -1, last = -1; + for (int i = 0; i < update->length; i++) { + if (rule->first == update->page[i]) first = i; + if (rule->last == update->page[i]) last = i; + if (first != -1 && last != -1) return first < last; + } + + return true; +} + +bool valid_update(Rules *rules, Update *update) { + for (int i = 0; i < rules->length; i++) { + if (!valid_rule(&(rules->rule[i]), update)) return false; + } + return true; +} + +int middle_page_number(Update *update) { + return update->page[update->length / 2]; +} + +int main() { + char *line; + + int sum = 0; + + Rules rules; + int rule_index = 0; + int first, last; + + Update update; + char *update_element; + + bool scanning_rules = true; + while ((line = aoc_read_line()) != NULL) { + if (scanning_rules) { + if (strlen(line) == 0) scanning_rules = false; + else { + sscanf(line, "%d|%d", &first, &last); + rules.rule[rules.length].first = first; + rules.rule[rules.length].last = last; + rules.length++; + } + } else { + update.length = 0; + update_element = strtok(line, ","); + while(update_element != NULL) { + update.page[update.length++] = atoi(update_element); + update_element = strtok(NULL, ","); + } + if (valid_update(&rules, &update)) sum += middle_page_number(&update); + } + } + + printf("Part 1: %d\n", sum); + // printf("Part 2: %d\n", xmas_sum); + + aoc_free(); + return 0; +}