diff --git a/day-02-c/.gitignore b/day-02-c/.gitignore new file mode 100644 index 0000000..f47cb20 --- /dev/null +++ b/day-02-c/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/day-02-c/task1.c b/day-02-c/task1.c new file mode 100644 index 0000000..88b12ea --- /dev/null +++ b/day-02-c/task1.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include + + +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; + + const int max_length = 16; + char buffer[17]; + int buf_length = 0; + + int line_no = 0; + while (true) { + bool first_number = true; + int last_number = INT_MIN; + int last_delta = 0; + bool safe = true; + int c; + while (true) { + c = fgetc(file); + if (buf_length < max_length && c >= '0' && c <= '9') { + buffer[buf_length] = c; + buf_length++; + continue; + } + + if (buf_length > 0) { + buffer[buf_length] = 0; + int number = atoi(buffer); + + if (first_number) { + first_number = false; + } else { + int delta = number - last_number; + if (last_delta != 0 && delta * last_delta < 0) { + safe = false; + } else if (delta == 0 || abs(delta) > 3) { + safe = false; + } + last_delta = delta; + } + + last_number = number; + buf_length = 0; + } + + if (c == EOF || c == '\n') { + break; + } + } + + if (safe && !first_number) { + safe_count++; + } + line_no++; + + if (c == EOF) { + break; + } + } + + printf("Safe count: %d\n", safe_count); + + fclose(file); +} diff --git a/day-02-c/task2.c b/day-02-c/task2.c new file mode 100644 index 0000000..59e2880 --- /dev/null +++ b/day-02-c/task2.c @@ -0,0 +1,120 @@ +#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(""); +}