From 40aa90ca888cbe67552893ba82f83b8f80b0c43f Mon Sep 17 00:00:00 2001 From: Vincent Douillet Date: Wed, 8 Dec 2021 09:51:04 +0100 Subject: day 7 --- 07.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 07.c (limited to '07.c') diff --git a/07.c b/07.c new file mode 100644 index 0000000..20caf95 --- /dev/null +++ b/07.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include "input.h" + +#define ABS(x) (x < 0 ? -(x) : x) +#define MIN(x, y) (x < y ? x : y) + +#define INPUT "input/07.txt" +#define INPUT_DOMAIN_MAX 2000 + +#define EXPECTED1 349769L +#define EXPECTED2 99540554L + +void part1(struct input_str* input) { + char* start = input->lines[0]; + char* end = start; + int sub_count_by_alt[INPUT_DOMAIN_MAX] = { 0 }; + + // parse input + long sub_count = 0; + while(*end != '\n') { + long alt = strtol(start, &end, 0); + start = end; + if(*end == ',') + start++; + + sub_count_by_alt[alt]++; + sub_count++; + } + + // brute force + long fuel_min = LONG_MAX; + for(int a = 0; a < INPUT_DOMAIN_MAX; a++) { + long current_fuel = 0; + for(int b = 0; b < INPUT_DOMAIN_MAX; b++) { + current_fuel += sub_count_by_alt[b] * ABS(b - a); + } + fuel_min = MIN(fuel_min, current_fuel); + } + + CHECK(fuel_min, EXPECTED1); +} + +long compute_fuel(int distance) { + long fuel = 0; + for(int i = 1; i <= distance; i++) { + fuel += i; + } + return fuel; +} + +void part2(struct input_str* input) { + char* start = input->lines[0]; + char* end = start; + int sub_count_by_alt[INPUT_DOMAIN_MAX] = { 0 }; + + // parse input + long sub_count = 0; + while(*end != '\n') { + long alt = strtol(start, &end, 0); + start = end; + if(*end == ',') + start++; + + sub_count_by_alt[alt]++; + sub_count++; + } + + // brute force + long fuel_min = LONG_MAX; + for(int a = 0; a < INPUT_DOMAIN_MAX; a++) { + long current_fuel = 0; + for(int b = 0; b < INPUT_DOMAIN_MAX; b++) { + current_fuel += sub_count_by_alt[b] * compute_fuel(ABS(b - a)); + } + fuel_min = MIN(fuel_min, current_fuel); + } + + CHECK(fuel_min, EXPECTED2); +} + +int main() { + // read input + struct input_str input; + input_str_read(&input, INPUT); + + // do stuff + part1(&input); + part2(&input); + + // cleanup & exit + input_str_free(&input); + return 0; +} -- cgit v1.2.3