day 05
This commit is contained in:
parent
ea7bb081cc
commit
590986cb5c
File diff suppressed because it is too large
Load Diff
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue