2024-12-09 19:12:05 -08:00
|
|
|
#include <limits.h>
|
2024-12-02 06:22:25 -08:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
2024-12-09 19:12:05 -08:00
|
|
|
#include <string.h>
|
2024-12-02 06:22:25 -08:00
|
|
|
|
|
|
|
#include "lfinput.h"
|
|
|
|
|
2024-12-09 19:12:05 -08:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2024-12-02 06:22:25 -08:00
|
|
|
void advent2024day05(void) {
|
2024-12-09 19:12:05 -08:00
|
|
|
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);
|
2024-12-02 06:22:25 -08:00
|
|
|
}
|