aoc_2024/day_2.c

86 lines
1.8 KiB
C

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int numbers[2048*2048];
int sizes[2048];
int _is_safe(int n, int size, int* levels) {
if(size <= 0) return 0;
int current = -1;
int direction = 0;
for(int i = 0; i < size; i++) {
if(i == n) continue;
int next = levels[i];
if(current == -1) {
current = next;
} else if(direction == 0 && (next < current && next >= current - 3)) {
direction = 1;
} else if(direction == 0 && (next > current && next <= current + 3)) {
direction = 2;
} else if(direction == 0) {
return 0;
} else if(direction == 1 && (next >= current || next < current - 3)) {
return 0;
} else if(direction == 2 && (next <= current || next > current + 3)) {
return 0;
}
current = next;
}
return 1;
}
int is_safe(int size, int* levels) {
for(int i = -1; i < size; i++) {
if(_is_safe(i, size, levels)) return 1;
}
return 0;
}
int main(int argc, char* argv[]) {
if(argc < 2) {
fprintf(stderr, "Filename required\n");
return 1;
}
FILE* file = fopen(argv[1], "r");
if(file == NULL) {
fprintf(stderr, "Could not open %s\n", argv[1]);
return 2;
}
memset(numbers, 0, sizeof(numbers));
char* line = NULL;
size_t line_size = 0;
int i = 0;
while(getline(&line, &line_size, file) > 0) {
char* save = NULL;
char* token = strtok_r(line, " ", &save);
if(token == NULL || token[0] == '\n' || token[0] == '\0') break;
int j = 0;
do {
numbers[i*2048 + j] = atoi(token);
j += 1;
} while((token = strtok_r(NULL, " ", &save)));
sizes[i] = j;
i += 1;
}
free(line);
int safe = 0;
for(i = 0; i < 2048; i++) {
if(sizes[i] == 0) continue;
if(is_safe(sizes[i], &numbers[2048*i])) {
safe += 1;
}
}
fprintf(stdout, "Safe: %d\n", safe);
return 0;
}