| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #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_);
- }
|