#include #include #include #define IMP #include "../../file.h" struct report { size_t cap; size_t size; long *data; }; size_t cstr_char_count(const char *cstr, char c); int cmp_sort(const void *this, const void *other); int main(int argc, char *argv[]) { enum file_err ferr; size_t line_num = 0; size_t i = 0; long res = 0; struct report *reports = NULL; size_t reports_size = 0; char *raw_input = NULL; size_t raw_input_size = 0; raw_input = (char *) file_read_all("./input.txt", &raw_input_size, &ferr); if ( ferr != FILE_ERR_OK ) { fprintf(stderr, "Failed to open file: %s\n", file_err_to_cstr(ferr)); exit(EXIT_FAILURE); } line_num = cstr_char_count(raw_input, '\n'); reports = calloc(line_num+1, sizeof(*reports)); { long ret = -1; char *str = raw_input; char *nstr = NULL; struct report *this = &reports[reports_size++]; if ( this->data == NULL ) { this->cap = 10; this->size = 0; this->data = calloc(this->cap, sizeof(*this->data)); } while ( true ) { ret = strtol(str, &nstr, 10); if ( ret == 0 ) { break; } str = nstr; if ( this->size+1 >= this->cap ) { this->cap <<= 1; this->data = realloc(this->data, this->cap * sizeof(*this->data)); } this->data[this->size++] = ret; if ( *str == '\n' ) { this = &reports[reports_size++]; if ( this->data == NULL ) { this->cap = 10; this->size = 0; this->data = calloc(this->cap, sizeof(*this->data)); } } } } if ( argc == 1 ) { for ( i = 0; i < reports_size; ++i ) { size_t j = 1; struct report *this = &reports[i]; long dir = this->data[0] - this->data[1]; if ( dir == 0 ) { ../../* if dir is == 0 it is already unsafe */ continue; } ++res; for ( j = 1; j < this->size; ++j ) { long diff = this->data[j-1] - this->data[j]; long diff_abs = labs(diff); if ( diff_abs < 1 || diff_abs > 3 ) { --res; break; } if ( ( diff > 0 && dir < 0 ) || ( diff < 0 && dir > 0 ) ) { --res; break; } } } } else { } printf("Result: %ld\n", res); for ( i = 0; i < reports_size; ++i ) { free(reports[i].data); } free(reports); free(raw_input); (void) argc; (void) argv; return 0; } size_t cstr_char_count(const char *cstr, char c) { size_t ret = 0; while ( *cstr != '\0' ) { ret += ( *cstr == c ); cstr++; } return ret; } int cmp_sort(const void *this, const void *other) { long this_ = *((long*) this); long other_ = *((long*) other); return (int) (this_ - other_); }