#include #include #include #include "../lib/util.h" #define PREAMBLE_LENGTH 25 #define MESSAGE_LENGTH 1000 bool has_valid_sum(unsigned long long message[MESSAGE_LENGTH], size_t index, unsigned long long number) { for (size_t x = index - PREAMBLE_LENGTH; x < index; x++) { for (size_t y = x + 1; y < index; y++) { if (message[x] + message[y] == number) { return true; } } } return false; } int part_1() { char *data_buffer = load_input(); unsigned long long message[MESSAGE_LENGTH] = {0}; size_t index = 0; char *number_text = strtok(data_buffer, "\n"); unsigned long long number; do { number = atoll(number_text); if (index >= PREAMBLE_LENGTH && !has_valid_sum(message, index, number)) { break; } else { message[index++] = number; } } while (number_text = strtok(NULL, "\n")); message[index] = number; free(data_buffer); return number; } int part_2() { char *data_buffer = load_input(); unsigned long long message[MESSAGE_LENGTH] = {0}; size_t index = 0; char *number_text = strtok(data_buffer, "\n"); unsigned long long number; do { number = atoll(number_text); if (index >= PREAMBLE_LENGTH && !has_valid_sum(message, index, number)) { break; } else { message[index++] = number; } } while (number_text = strtok(NULL, "\n")); message[index] = number; unsigned long long sum; int highest, lowest; for (int x = 0; x < index - 1; x++) { sum = 0; highest = 0; lowest = number; bool just_right = false; for (int y = x; y < index - 1; y++) { if (message[y] > highest) highest = message[y]; if (message[y] < lowest) lowest = message[y]; sum += message[y]; if (sum >= number) break; } if (sum == number) break; } free(data_buffer); return lowest + highest; } int main() { printf("Part 1: %d\n", part_1()); printf("Part 2: %d\n", part_2()); }