72 lines
1.3 KiB
C
72 lines
1.3 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
#define BUFFER_SIZE 1024
|
|
|
|
typedef struct levels {
|
|
size_t mem_size;
|
|
size_t size;
|
|
int *data;
|
|
} levels_t;
|
|
|
|
int main(void) {
|
|
FILE *fp = fopen("input", "r");
|
|
|
|
if (fp == NULL) {
|
|
perror("input");
|
|
return 1;
|
|
}
|
|
|
|
char buffer[BUFFER_SIZE];
|
|
|
|
levels_t levels;
|
|
levels.mem_size = 10;
|
|
levels.size = 0;
|
|
levels.data = malloc(sizeof(unsigned int) * levels.mem_size);
|
|
|
|
unsigned int sum = 0;
|
|
while (fgets(buffer, BUFFER_SIZE, fp) != NULL) {
|
|
char *next = strtok(buffer, " ");
|
|
|
|
while (next != NULL) {
|
|
if (levels.size >= levels.mem_size) {
|
|
levels.mem_size *= 2;
|
|
levels.data =
|
|
realloc(levels.data, levels.mem_size * sizeof(unsigned int));
|
|
}
|
|
|
|
sscanf(next, "%d", &levels.data[levels.size]);
|
|
levels.size++;
|
|
|
|
next = strtok(NULL, " ");
|
|
}
|
|
|
|
bool safe = true;
|
|
int diff = levels.data[1] - levels.data[0];
|
|
int increasing = diff > 0 ? 1 : -1;
|
|
for (size_t i = 1; i < levels.size; i++) {
|
|
diff = increasing * (levels.data[i] - levels.data[i - 1]);
|
|
|
|
if (diff < 1 || diff > 3) {
|
|
safe = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (safe) {
|
|
sum++;
|
|
}
|
|
|
|
levels.size = 0;
|
|
}
|
|
|
|
free(levels.data);
|
|
|
|
printf("%u\n", sum);
|
|
|
|
fclose(fp);
|
|
|
|
return 0;
|
|
}
|