#include #include #include #include void print_numbers(int* numbers, int numbers_length); bool are_safe(int* numbers, int numbers_length); int find_first_unsafe(int* numbers, int numbers_length); const int MAX_NUMBER_LENGTH = 16; const int MAX_NUMBERS = 100; int main(int argc, char** argv) { if (argc != 2) { fputs("Usage: ", stdout); fputs(argv[0], stdout); fputs(" \n", stdout); return 1; } FILE* file = fopen(argv[1], "r"); unsigned int safe_count = 0; int line_no = 0; while (true) { char buffer[MAX_NUMBER_LENGTH]; int buf_length = 0; int numbers[MAX_NUMBERS]; int numbers_length = 0; int c; while (true) { c = fgetc(file); if (buf_length < MAX_NUMBER_LENGTH && c >= '0' && c <= '9') { buffer[buf_length++] = c; continue; } if (buf_length > 0 && numbers_length < MAX_NUMBERS) { buffer[buf_length] = 0; int number = atoi(buffer); numbers[numbers_length++] = number; buf_length = 0; } if (c == EOF || c == '\n') { break; } } if (numbers_length > 0 && are_safe(numbers, numbers_length)) { safe_count++; } line_no++; if (c == EOF) { break; } } printf("Safe count: %d\n", safe_count); fclose(file); } bool are_safe(int* numbers, int numbers_length) { print_numbers(numbers, numbers_length); int first_unsafe = find_first_unsafe(numbers, numbers_length); if (first_unsafe < 0) { return true; } int without[MAX_NUMBERS]; memcpy(without, numbers, sizeof(int) * first_unsafe); memcpy(without + first_unsafe, numbers + first_unsafe + 1, sizeof(int) * (numbers_length - 1)); if (find_first_unsafe(without, numbers_length - 1) < 0) { return true; } without[first_unsafe] = numbers[first_unsafe]; return find_first_unsafe(without, numbers_length - 1) < 0; } int find_first_unsafe(int* numbers, int numbers_length) { if (numbers_length <= 1) { return -1; } int last_number = numbers[1]; int last_delta = last_number - numbers[0]; if (last_delta == 0 || abs(last_delta) > 3) { return 0; } for (int i = 2; i < numbers_length; i++) { int number = numbers[i]; int delta = number - last_number; if (delta == 0 || abs(delta) > 3) { return i - 1; } else if (delta * last_delta < 0) { return i - 1; } last_number = number; last_delta = delta; } return -1; } void print_numbers(int* numbers, int numbers_length) { for (int i = 0; i < numbers_length; i++) { printf("%d ", numbers[i]); } puts(""); }