86 lines
1.4 KiB
C
86 lines
1.4 KiB
C
#include "input.h"
|
|
#include "parse.h"
|
|
#include "heapsort.h"
|
|
|
|
struct list {
|
|
int left[1000];
|
|
int right[1000];
|
|
};
|
|
|
|
int parse_input(const char * input, int length, struct list * list)
|
|
{
|
|
const char * end = input + length;
|
|
|
|
int i = 0;
|
|
while (input < end) {
|
|
input = parse_base10(input, &list->left[i]);
|
|
input = parse_skip(input, ' ');
|
|
input = parse_base10(input, &list->right[i]);
|
|
input = parse_skip(input, '\n');
|
|
i++;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
int abs(int n)
|
|
{
|
|
if (n < 0)
|
|
return -n;
|
|
else
|
|
return n;
|
|
}
|
|
|
|
int day1_part1(char * input, int length)
|
|
{
|
|
struct list list;
|
|
int list_length = parse_input(input, length, &list);
|
|
|
|
heapsort(list.left, list_length);
|
|
heapsort(list.right, list_length);
|
|
|
|
int sum = 0;
|
|
for (int i = 0; i < list_length; i++) {
|
|
int distance = abs(list.left[i] - list.right[i]);
|
|
sum += distance;
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
int day1_part2(char * input, int length)
|
|
{
|
|
struct list list;
|
|
int list_length = parse_input(input, length, &list);
|
|
|
|
heapsort(list.left, list_length);
|
|
heapsort(list.right, list_length);
|
|
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
int sum = 0;
|
|
|
|
while (i < list_length) {
|
|
int n = list.left[i];
|
|
int mul_l = 1;
|
|
while (list.left[i + mul_l] == n) {
|
|
mul_l += 1;
|
|
}
|
|
i += mul_l;
|
|
|
|
while (list.right[j] < n) {
|
|
j++;
|
|
}
|
|
int mul_r = 0;
|
|
while (list.right[j + mul_r] == n) {
|
|
mul_r += 1;
|
|
}
|
|
j += mul_r;
|
|
|
|
sum += n * mul_l * mul_r;
|
|
}
|
|
|
|
return sum;
|
|
}
|