#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; }