#include #include #include #define CHARS_MAX 64 #define MAX_LEVELS 16 #define abs(a) ((a) < 0 ? (-(a)) : (a)) int is_safe(int *levels, int level_count); int main() { char *p, *buf, c; buf = calloc(CHARS_MAX, sizeof(char)); p = buf; int safes1 = 0, safes2 = 0; int levels[MAX_LEVELS], level_count = 0; while ((c = getchar()) != EOF) { *p++ = c; if (c != '\n') { continue; } p = buf; int level = 0; p--; do { p++; sscanf(p, "%i", &levels[level_count]); level_count++; while (*p != ' ' && *p != '\n') p++; } while(*p != '\n'); if (is_safe(levels, level_count)) { safes1++; } int new_levels[MAX_LEVELS]; for (int i = 0; i < level_count; i++) { memcpy(new_levels, levels, level_count * sizeof(levels[0])); for (int j = i; j < level_count - 1; j++) { new_levels[j] = levels[j+1]; } if (is_safe(new_levels, level_count - 1)) { safes2++; break; } } memset(buf, 0, CHARS_MAX); p = buf; level_count = 0; } free(buf); printf("%i\n", safes1); printf("%i\n", safes2); } int is_safe(int *levels, int level_count) { int diff = 0, safe = 1; for (int i = 0; i < level_count; i++) { if (i != 0) { if (abs(levels[i] - levels[i-1]) < 1 || abs(levels[i] - levels[i-1]) > 3) { safe = 0; } if ((levels[i] - levels[i-1]) * diff < 0) { safe = 0; } diff = levels[i] - levels[i-1]; } } return safe; }