diff options
Diffstat (limited to '07.c')
-rw-r--r-- | 07.c | 95 |
1 files changed, 95 insertions, 0 deletions
@@ -0,0 +1,95 @@ +#include <stdlib.h> +#include <stdio.h> +#include <limits.h> +#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; +} |