aoc-2021/src/day_1.c

129 lines
2.6 KiB
C

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include "day.h"
#define DATA_MAX_LEN 2048
int parse_long_from_buff(char * buffer, int64_t * val) {
*val = strtol(buffer, NULL, 16);
if (*val == LONG_MIN || *val == LONG_MAX) {
return -2;
}
return 0;
}
int read_input(const char * file_path, int64_t *data, uint16_t max_len) {
char buffer[64];
int c;
int ret = 0;
FILE * file = fopen(file_path, "r");
int data_ndx = 0;
if (file != NULL) {
int buffer_ndx = 0;
while ((c = fgetc(file)) != EOF) {
if (c == '\n') {
buffer[buffer_ndx] = 0;
ret = parse_long_from_buff(buffer, &data[data_ndx]);
if (ret < 0) {
break;
}
data_ndx++;
if (data_ndx >= max_len) {
ret = -3;
break;
}
buffer_ndx = 0;
}
else {
buffer[buffer_ndx] = (char)c;
buffer_ndx++;
}
}
if (buffer_ndx > 0) {
ret = parse_long_from_buff(buffer, &data[data_ndx]);
if (ret == 0) {
data_ndx++;
}
}
}
else {
ret = -1;
}
if (ret == 0) {
ret = data_ndx;
}
if (file != NULL) {
fclose(file);
}
return ret;
}
void part_1(const int64_t * data, uint16_t data_len) {
int64_t last_value;
int16_t inc_count = 0;
last_value = data[0];
for (uint16_t i = 1; i < (uint16_t)data_len; i++) {
if (data[i] > last_value) {
inc_count++;
}
last_value = data[i];
}
printf("PART 1: %d values increased!\n", inc_count);
}
void part_2(const int64_t * data, uint16_t data_len) {
int64_t old_window_sum;
int64_t window_sum;
int16_t inc_count = 0;
old_window_sum = data[0] + data[1] + data[2];
for (uint16_t i = 3; i < (uint16_t)data_len; i++) {
window_sum = old_window_sum - data[i-3] + data[i];
if (window_sum > old_window_sum) {
inc_count++;
}
old_window_sum = window_sum;
}
printf("PART 2: %d windows increased!\n", inc_count);
}
int day_1() {
char * path = "../inputs/day_1.txt";
int data_len;
int64_t data[DATA_MAX_LEN];
data_len = read_input(path, data, DATA_MAX_LEN);
if (data_len < 0) {
printf("read_input returned an error: %d\n", data_len);
return data_len;
}
part_1(data, data_len);
part_2(data, data_len);
return 0;
}