aoc/src/2024/05.c

95 lines
2.0 KiB
C
Raw Normal View History

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
}