aoc_omni/c/2020/9/main.c
2025-11-30 21:22:21 -05:00

83 lines
1.9 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#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());
}