83 lines
1.9 KiB
C
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());
|
|
}
|