day 01
This commit is contained in:
parent
68a526c326
commit
3e894700ea
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,56 @@
|
|||
#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);
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3
|
||||
Loading…
Reference in New Issue