aoc_omni/c/2020/1/main.c

108 lines
2.1 KiB
C
Raw Normal View History

2025-11-30 21:22:21 -05:00
#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());
}