AdventOfCode/2024/src/day1.c
2024-12-03 08:55:14 +01:00

118 lines
No EOL
3.3 KiB
C

#include "include/day1_input.h"
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
struct list_ctx {
u_int32_t* list;
size_t list_len;
};
struct list_pair {
struct list_ctx *left;
struct list_ctx *right;
};
struct list_pair *parse_input_day1() {
struct list_pair *ctx = malloc(sizeof(struct list_pair));
ctx->left = malloc(sizeof(struct list_ctx));
ctx->left->list = malloc(1000 * sizeof(u_int32_t));
ctx->left->list_len = 1000;
ctx->right = malloc(sizeof(struct list_ctx));
ctx->right->list = malloc(1000 * sizeof(u_int32_t));
ctx->right->list_len = 1000;
int list_i = 0;
int list_buf_len = 0;
char *list_buf = NULL;
for(int i = 0; i < input_day1_txt_len; i++) {
char c = input_day1_txt[i];
switch(c) {
case ' ':
if (list_buf_len) {
ctx->left->list[list_i] = strtoul(list_buf, NULL, 10);
list_buf_len = 0;
free(list_buf);
list_buf = NULL;
};
break;
case '\n': {
ctx->right->list[list_i] = strtoul(list_buf, NULL, 10);
list_i++;
list_buf_len = 0;
free(list_buf);
list_buf = NULL;
break;
}
default: {
list_buf_len++;
list_buf = realloc(list_buf, list_buf_len * sizeof(char));
list_buf[list_buf_len-1] = c;
}
}
}
return ctx;
}
void selection_sort(struct list_ctx *ctx) {
for(int start_i = 0; start_i < ctx->list_len; start_i++) {
size_t min_i = start_i;
for (size_t i = start_i + 1; i < ctx->list_len; i++) {
if (ctx->list[i] < ctx->list[min_i]) {
min_i = i;
}
}
if (min_i != start_i) {
u_int32_t t = ctx->list[start_i];
ctx->list[start_i] = ctx->list[min_i];
ctx->list[min_i] = t;
}
}
}
char *day_1_part_1() {
struct list_pair *pair = parse_input_day1();
selection_sort(pair->left);
selection_sort(pair->right);
int total = 0;
for(int i = 0; i < 1000; i++)
total += pair->left->list[i] > pair->right->list[i] ? pair->left->list[i] - pair->right->list[i] : pair->right->list[i] - pair->left->list[i];
free(pair->left->list);
free(pair->right->list);
free(pair->left);
free(pair->right);
free(pair);
int len = snprintf(NULL, 0, "%d", total);
char *total_str = malloc(len +1);
snprintf(total_str, len, "%d", total);
return total_str;
}
char *day_1_part_2() {
struct list_pair *pair = parse_input_day1();
int total = 0;
// TODO: do not the O(n^2)
for(int left_i = 0; left_i < pair->left->list_len; left_i++) {
int c = 0;
for(int right_i = 0; right_i < pair->right->list_len; right_i++)
if(pair->left->list[left_i] == pair->right->list[right_i]) c++;
total += c*pair->left->list[left_i];
}
free(pair->left->list);
free(pair->right->list);
free(pair->left);
free(pair->right);
free(pair);
int len = snprintf(NULL, 0, "%d", total) + 1;
char *total_str = malloc(len);
snprintf(total_str, len, "%d", total);
return total_str;
}