#include #include #include #define IMP #include "../../file.h" #include "../../str.h" struct rect { long l; long w; long h; }; #define BL_MIN(v1, v2) ((((v1) >= (v2)) * (v2)) + (((v1) < (v2)) * (v1))) #define BL_MAX(v1, v2) ((((v1) >= (v2)) * (v1)) + (((v1) < (v2)) * (v2))) int main(int argc, char *argv[]) { enum file_err ferr; long res = 0; size_t i = 0; struct rect r = {0}; struct str str_input = {0}; size_t num_lines = 0; struct rect *rects = NULL; size_t rects_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); } str_input = str_from_cstr(raw_input, raw_input_size); num_lines = str_count_char(str_input, '\n'); rects = calloc(num_lines, sizeof(*rects)); { struct str_tokenizer st = str_tokenize(str_input, '\n'); struct str str = str_tokenizer_next(&st); while ( str.size != (size_t) -1 ) { char *nstr = (char *) str.data; r.l = strtol(nstr, &nstr, 10); r.w = strtol(++nstr, &nstr, 10); r.h = strtol(++nstr, NULL, 10); rects[rects_size++] = r; str = str_tokenizer_next(&st); } } if ( argc == 1 ) { long s1 = 0; long s2 = 0; long s3 = 0; long m1 = 0; for ( i = 0; i < rects_size; ++i ) { r = rects[i]; s1 = r.l * r.w; s2 = r.w * r.h; s3 = r.h * r.l; m1 = BL_MIN(s2, s3); res += (s1 * 2) + (s2 * 2) + (s3 * 2) + BL_MIN(s1, m1); } } else { long m1 = 0; long m2 = 0; long ma1 = 0; for ( i = 0; i < rects_size; ++i ) { r = rects[i]; m1 = BL_MIN(r.l, r.w); ma1 = BL_MAX(r.l, r.w); m2 = BL_MIN(r.h, ma1); res += ((m1 + m1 + m2 + m2) + (r.l * r.w * r.h)); } } printf("Result: %ld\n", res); free(rects); free(raw_input); (void) argc; (void) argv; return 0; }