57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
#include "aoc.h"
|
|
#include <stdlib.h>
|
|
|
|
typedef struct {
|
|
i64 *data;
|
|
isize len, cap;
|
|
} Ints;
|
|
|
|
static int
|
|
cmp_i64(const void *a, const void *b) {
|
|
return *(i64 *)a - *(i64 *)b;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
Arena *arena = make_arena(Megabytes(1));
|
|
Arena *temp = make_arena(Megabytes(1));
|
|
|
|
Ints left = {0}, right = {0};
|
|
|
|
Tokens lines = read_lines(arena, argv[1]);
|
|
for (isize i = 0; i < lines.len; i++) {
|
|
str line = lines.tokens[i];
|
|
str fst, snd;
|
|
str_split(line, STR(" "), &fst, &snd);
|
|
|
|
*push(&left, arena) = parse_i64(str_trim(fst), *temp);
|
|
*push(&right, arena) = parse_i64(str_trim(snd), *temp);
|
|
}
|
|
|
|
// Part 1
|
|
qsort(left.data, left.len, sizeof(i64), cmp_i64);
|
|
qsort(right.data, right.len, sizeof(i64), cmp_i64);
|
|
|
|
i64 part_1 = 0;
|
|
ASSERT(left.len == right.len);
|
|
for (isize i = 0; i < left.len; i++) {
|
|
part_1 += labs(left.data[i] - right.data[i]);
|
|
}
|
|
printf("%ld\n", part_1);
|
|
ASSERT(part_1 == 1223326);
|
|
|
|
// Part 2
|
|
i64 part_2 = 0;
|
|
for (isize i = 0; i < left.len; i++) {
|
|
i64 l = left.data[i], r = right.data[i];
|
|
// count occurrences of `l` in `right`
|
|
int occurrences = 0;
|
|
// since arrays are sorted, only need to go up to value `l`
|
|
for (isize j = 0; j < right.len && right.data[j] <= l; j++) {
|
|
occurrences += (right.data[j] == l);
|
|
}
|
|
part_2 += l * occurrences;
|
|
}
|
|
printf("%ld\n", part_2);
|
|
ASSERT(part_2 == 21070419);
|
|
}
|