Day two
This commit is contained in:
1
day-02-c/.gitignore
vendored
Normal file
1
day-02-c/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.out
|
||||||
76
day-02-c/task1.c
Normal file
76
day-02-c/task1.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
fputs("Usage: ", stdout);
|
||||||
|
fputs(argv[0], stdout);
|
||||||
|
fputs(" <input file>\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);
|
||||||
|
}
|
||||||
120
day-02-c/task2.c
Normal file
120
day-02-c/task2.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
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(" <input file>\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("");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user