This commit is contained in:
Georgios Samaras 2024-12-06 01:20:30 +01:00
parent ea7bb081cc
commit 590986cb5c
3 changed files with 1473 additions and 0 deletions

1362
day-05/input.txt Normal file

File diff suppressed because it is too large Load Diff

83
day-05/main.c Normal file
View File

@ -0,0 +1,83 @@
#include "aoc.h"
#include <stdlib.h>
static const u8 PRED_BIT = 0x01;
static const u8 SUCC_BIT = 0x02;
// matrix[a][b] & PRED_BIT != 0 means that a must precede b.
// matrix[a][b] & SUCC_BIT != 0 means that a must succeed b.
// by symmetry, (matrix[a][b] & PRED_BIT) == (matrix[b][a] & SUCC_BIT).
// matrix[a][b] == 0 means that there is no constraint between a and b.
// by inspection, the inputs are all >= 0 and < 100.
static u8 matrix[100][100] = {0};
static int
compare(const void *pa, const void *pb) {
i32 a = *(const i32 *)pa;
i32 b = *(const i32 *)pb;
if (matrix[a][b] & PRED_BIT) return -1;
if (matrix[a][b] & SUCC_BIT) return 1;
return 0;
}
int main(int argc, char **argv) {
Arena *arena = make_arena(Megabytes(1));
str input = read_file(arena, argv[1]);
str line;
while ((line = str_next_token(&input, STR("\n"))).len > 0) {
str fst, snd;
str_split(line, STR("|"), &fst, &snd);
i32 a = parse_i64(fst, *arena);
i32 b = parse_i64(snd, *arena);
matrix[a][b] |= PRED_BIT;
matrix[b][a] |= SUCC_BIT;
}
i32 part_1 = 0;
i32 part_2 = 0;
while ((line = str_next_token(&input, STR("\n"))).len > 0) {
str value_str;
struct {
i32 *data;
isize len, cap;
} values = {0};
void *watermark = arena->top;
while ((value_str = str_next_token(&line, STR(","))).len > 0) {
i32 value = parse_i64(value_str, *arena);
*push(&values, arena) = value;
}
arena->top = watermark;
bool row_ok = true;
for (isize i = 0; i < values.len && row_ok; i++) {
i32 value = values.data[i];
for (isize j = 0; j < values.len; j++) {
if (i == j) continue;
i32 other = values.data[j];
if (matrix[value][other]) {
if (i < j && !(matrix[value][other] & PRED_BIT)) {
row_ok = false;
break;
}
if (i > j && !(matrix[value][other] & SUCC_BIT)) {
row_ok = false;
break;
}
}
}
}
if (row_ok) {
part_1 += values.data[values.len / 2];
}
else {
qsort(values.data, values.len, sizeof(i32), compare);
part_2 += values.data[values.len / 2];
}
}
printf("%d\n", part_1);
printf("%d\n", part_2);
}

28
day-05/test.txt Normal file
View File

@ -0,0 +1,28 @@
47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47