#include #include #include #include #include "lfinput.h" #define RULES_SZ 1176 struct Rule { int a; int b; }; static int part_one(int *pages, size_t sz, struct Rule *rules) { int midpoint = pages[sz / 2]; for (size_t ridx = 0; ridx < RULES_SZ; ++ridx) { int a = -1; int b = 500; for (int pidx = 0; pidx < sz; ++pidx) { if (pages[pidx] == rules[ridx].a) { a = pidx; } if (pages[pidx] == rules[ridx].b) { b = pidx; } if (a > b) { midpoint = 0; } } } return midpoint; } int rule_matrix[100][100] = {0}; static int sort(const void *a, const void *b) { int ia = *(int*)a; int ib = *(int*)b; if (rule_matrix[ia][ib]) { return -1; } if (rule_matrix[ib][ia]) { return 1; } return 0; } static int part_two(int *pages, size_t sz, struct Rule *rules) { int s = 0; int sorted[100]; memcpy(sorted, pages, sizeof(int) * sz); qsort(sorted, sz, sizeof(int), sort); if (memcmp(pages, sorted, sz * sizeof(int)) != 0) { s += sorted[sz / 2]; } return s; } void advent2024day05(void) { size_t sz = 0; char **input = get_lines("input/2024/05", &sz); char *errstr = NULL; struct Rule rules[RULES_SZ]; int p1 = 0, p2 = 0; size_t i = 0; for (; strlen(input[i]) == 5; ++i) { sscanf(input[i], "%d|%d", &rules[i].a, &rules[i].b); rule_matrix[rules[i].a][rules[i].b] = 1; } for (; i < sz; ++i) { size_t sz_sp = 0; char **sp = split(input[i], &sz_sp, ","); int *pages = malloc(sizeof(int) * sz_sp); for (size_t j = 0; j < sz_sp; ++j) { pages[j] = (int) strtonum(sp[j], INT_MIN, INT_MAX, &errstr); } p1 += part_one(pages, sz_sp, rules); p2 += part_two(pages, sz_sp, rules); free(pages); free(sp); } printf("%d\n", p1); printf("%d\n", p2); del_lines(input); }