feat: blyat
This commit is contained in:
parent
7f7a6c21e9
commit
1ecac60045
1 changed files with 102 additions and 40 deletions
|
|
@ -6,13 +6,14 @@
|
||||||
|
|
||||||
int count_lines(char *filename);
|
int count_lines(char *filename);
|
||||||
|
|
||||||
|
int check_report(char *line, int is_problem);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
FILE *file;
|
FILE *file;
|
||||||
char filename[] = "input.txt";
|
char filename[] = "input.txt";
|
||||||
char *buffer = malloc(BUFFER_SIZE);
|
char *buffer = malloc(BUFFER_SIZE);
|
||||||
char *saveptr;
|
|
||||||
char *current_number_string;
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
int check;
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
|
|
||||||
|
|
@ -22,44 +23,24 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
while (fgets(buffer, BUFFER_SIZE, file) != NULL) {
|
while (fgets(buffer, BUFFER_SIZE, file) != NULL) {
|
||||||
char *line = buffer;
|
char *buffer_copy = malloc(BUFFER_SIZE);
|
||||||
int previous_level = -1;
|
memcpy(buffer_copy, buffer, BUFFER_SIZE);
|
||||||
int is_decreasing = -1;
|
check = check_report(buffer, 0);
|
||||||
int is_last = 0;
|
count += check;
|
||||||
while ((current_number_string = strtok_r(line, " ", &saveptr))) {
|
if (!check) {
|
||||||
if (line) {
|
memcpy(buffer, buffer_copy, BUFFER_SIZE);
|
||||||
line = NULL;
|
remove_second_level(buffer);
|
||||||
|
check = check_report(buffer, 1);
|
||||||
|
count += check;
|
||||||
}
|
}
|
||||||
if (current_number_string[strlen(current_number_string) - 1] == '\n') {
|
if (!check) {
|
||||||
current_number_string[strlen(current_number_string) - 1] = '\0';
|
memcpy(buffer, buffer_copy, BUFFER_SIZE);
|
||||||
is_last = 1;
|
remove_first_level(buffer);
|
||||||
}
|
check = check_report(buffer, 1);
|
||||||
int level = atoi(current_number_string);
|
count += check;
|
||||||
if (previous_level == -1) {
|
|
||||||
previous_level = level;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (abs(level - previous_level) < 1 || abs(level - previous_level) > 3) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_decreasing == -1) {
|
|
||||||
is_decreasing = (level < previous_level) ? 1 : 0;
|
|
||||||
}
|
|
||||||
if (is_decreasing && level < previous_level) {
|
|
||||||
previous_level = level;
|
|
||||||
if (is_last) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
} else if (!is_decreasing && level > previous_level) {
|
|
||||||
previous_level = level;
|
|
||||||
if (is_last) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (!check) {
|
||||||
|
printf("%s", buffer_copy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("%d", count);
|
printf("%d", count);
|
||||||
|
|
@ -68,3 +49,84 @@ int main() {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove_second_level(char *report) {
|
||||||
|
char *first_space = strchr(report, ' ');
|
||||||
|
if (!first_space)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char *second_space = strchr(first_space + 1, ' '); // Find the second space
|
||||||
|
if (!second_space)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memmove(first_space + 1, second_space + 1, strlen(second_space + 1) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_first_level(char *report) {
|
||||||
|
char *first_space = strchr(report, ' ');
|
||||||
|
if (!first_space)
|
||||||
|
return;
|
||||||
|
memmove(report, first_space + 1, strlen(first_space + 1) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int check_report(char *report, int is_problem) {
|
||||||
|
char *current_number_string;
|
||||||
|
char *saveptr;
|
||||||
|
int previous_level = -1;
|
||||||
|
int is_decreasing = -1;
|
||||||
|
int is_last = 0;
|
||||||
|
int level;
|
||||||
|
while ((current_number_string = strtok_r(report, " ", &saveptr))) {
|
||||||
|
if (report) {
|
||||||
|
report = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_number_string[strlen(current_number_string) - 1] == '\n') {
|
||||||
|
current_number_string[strlen(current_number_string) - 1] = '\0';
|
||||||
|
is_last = 1;
|
||||||
|
}
|
||||||
|
level = atoi(current_number_string);
|
||||||
|
if (previous_level == -1) {
|
||||||
|
previous_level = level;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abs(level - previous_level) < 1 || abs(level - previous_level) > 3) {
|
||||||
|
if (!is_problem) {
|
||||||
|
if (is_last) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
is_problem = 1;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_decreasing == -1) {
|
||||||
|
is_decreasing = (level < previous_level) ? 1 : 0;
|
||||||
|
}
|
||||||
|
if (is_decreasing && level < previous_level) {
|
||||||
|
previous_level = level;
|
||||||
|
if (is_last) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (!is_decreasing && level > previous_level) {
|
||||||
|
previous_level = level;
|
||||||
|
if (is_last) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!is_problem) {
|
||||||
|
if (is_last) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
is_problem = 1;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue