#include "aoc.h" #include 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); }