#include #include #include #include #include #include "../lib/util.h" char *example = "1721\n" "979\n" "366\n" "299\n" "675\n" "1456\n"; #define INPUT_NUMBER_BUFFER_LEN 5 #define TARGET 2020 #define NUMBER_BUFFER_LEN TARGET + 1 bool isDigit(char c) { return c >= '0' && c <= '9'; } long part_1() { bool number_buffer[NUMBER_BUFFER_LEN] = {0}; char input_number_buffer[INPUT_NUMBER_BUFFER_LEN] = {0}; char *data_buffer = load_input(); char *data = data_buffer; do { for (int i = 0; i < INPUT_NUMBER_BUFFER_LEN; i++) { if (isDigit(*data)) { input_number_buffer[i] = *data; data++; } else { input_number_buffer[i] = 0; } } int number = atoi(input_number_buffer); // Check for TARGET matches if (number_buffer[TARGET - number]) { long x = number; long y = TARGET - number; free(data_buffer); return x * y; } number_buffer[number] = true; data++; } while (*data != 0); return 0; } long part_2() { int number_buffer[NUMBER_BUFFER_LEN] = {0}; char input_number_buffer[INPUT_NUMBER_BUFFER_LEN] = {0}; int previously_seen_numbers[200] = {0}; size_t previously_seen_numbers_index = 0; size_t number_buffer_index = 0; char *data_buffer = load_input(); char *data = data_buffer; do { for (int i = 0; i < INPUT_NUMBER_BUFFER_LEN; i++) { if (isDigit(*data)) { input_number_buffer[i] = *data; data++; } else { input_number_buffer[i] = 0; } } int number = atoi(input_number_buffer); // Check for TARGET matches int x = number_buffer[TARGET - number]; if (x > 0) { free(data_buffer); return number * x * (TARGET - number - x); } for (int i = 0; i < previously_seen_numbers_index; i++) { size_t index = number + previously_seen_numbers[i]; if (index < NUMBER_BUFFER_LEN) number_buffer[index] = number; } previously_seen_numbers[previously_seen_numbers_index] = number; previously_seen_numbers_index++; data++; } while (*data != 0); return 0; } int main() { printf("Part 1: %d\n", part_1()); printf("Part 2: %d\n", part_2()); }