86 lines
1.8 KiB
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;
|
|
}
|