108 lines
2.1 KiB
C
108 lines
2.1 KiB
C
|
|
#include <stddef.h>
|
||
|
|
#include <stdbool.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
#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());
|
||
|
|
}
|