This commit is contained in:
Georgios Samaras 2024-12-01 11:39:09 +01:00
parent 68a526c326
commit 3e894700ea
3 changed files with 1062 additions and 0 deletions

1000
day-01/input.txt Normal file

File diff suppressed because it is too large Load Diff

56
day-01/main.c Normal file
View File

@ -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);
}

6
day-01/test.txt Normal file
View File

@ -0,0 +1,6 @@
3 4
4 3
2 5
1 3
3 9
3 3