add day 1
This commit is contained in:
parent
3246535ae6
commit
9f97e0a390
6 changed files with 122 additions and 6 deletions
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
|
@ -6,7 +6,7 @@
|
|||
"request": "launch",
|
||||
"name": "Launch",
|
||||
"program": "${workspaceFolder}/build/adventofcode/adventofcode",
|
||||
"args": ["2024", "1", "1"],
|
||||
"args": ["2024", "1", "2"],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"preLaunchTask": "CMake: build",
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ endforeach()
|
|||
add_custom_target(prebuild_target DEPENDS ${adv_input})
|
||||
|
||||
add_dependencies(2024 prebuild_target)
|
||||
target_link_libraries(2024 m)
|
||||
target_sources(2024
|
||||
PRIVATE
|
||||
src/day1.c
|
||||
|
|
117
2024/src/day1.c
117
2024/src/day1.c
|
@ -1,3 +1,116 @@
|
|||
void *day_1_part_1() {
|
||||
return "yes";
|
||||
#include "include/days.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() {
|
||||
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;
|
||||
list_buf = NULL;
|
||||
};
|
||||
break;
|
||||
case '\n': {
|
||||
ctx->right->list[list_i] = strtoul(list_buf, NULL, 10);
|
||||
list_i++;
|
||||
list_buf_len = 0;
|
||||
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();
|
||||
|
||||
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();
|
||||
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;
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
#include "day1.h"
|
||||
#include "day1_input.h"
|
||||
|
||||
char *day_1_part_1(void);
|
|
@ -43,9 +43,11 @@ int main(int argc, char** argv) {
|
|||
char *(*part_func)(void) = dlsym(handle, fname);
|
||||
|
||||
if(part_func) {
|
||||
fprintf(stderr, "day %s part %s: %s\n", argv[2], argv[3], part_func());
|
||||
char *r = part_func();
|
||||
fprintf(stderr, "day %s part %s: %s\n", argv[2], argv[3], r);
|
||||
free(r);
|
||||
} else {
|
||||
fprintf(stderr, "Failed to call %s", fname);
|
||||
fprintf(stderr, "Failed to call %s: implementation missing!\n", fname);
|
||||
err = 4;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue