main.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define IMP
  5. #include "../../file.h"
  6. #include "../../str.h"
  7. struct rect {
  8. long l;
  9. long w;
  10. long h;
  11. };
  12. #define BL_MIN(v1, v2) ((((v1) >= (v2)) * (v2)) + (((v1) < (v2)) * (v1)))
  13. #define BL_MAX(v1, v2) ((((v1) >= (v2)) * (v1)) + (((v1) < (v2)) * (v2)))
  14. int
  15. main(int argc, char *argv[])
  16. {
  17. enum file_err ferr;
  18. long res = 0;
  19. size_t i = 0;
  20. struct rect r = {0};
  21. struct str str_input = {0};
  22. size_t num_lines = 0;
  23. struct rect *rects = NULL;
  24. size_t rects_size = 0;
  25. char *raw_input = NULL;
  26. size_t raw_input_size = 0;
  27. raw_input = (char *) file_read_all("./input.txt",
  28. &raw_input_size,
  29. &ferr);
  30. if ( ferr != FILE_ERR_OK ) {
  31. fprintf(stderr, "Failed to open file: %s\n",
  32. file_err_to_cstr(ferr));
  33. exit(EXIT_FAILURE);
  34. }
  35. str_input = str_from_cstr(raw_input, raw_input_size);
  36. num_lines = str_count_char(str_input, '\n');
  37. rects = calloc(num_lines, sizeof(*rects));
  38. {
  39. struct str_tokenizer st = str_tokenize(str_input, '\n');
  40. struct str str = str_tokenizer_next(&st);
  41. while ( str.size != (size_t) -1 ) {
  42. char *nstr = (char *) str.data;
  43. r.l = strtol(nstr, &nstr, 10);
  44. r.w = strtol(++nstr, &nstr, 10);
  45. r.h = strtol(++nstr, NULL, 10);
  46. rects[rects_size++] = r;
  47. str = str_tokenizer_next(&st);
  48. }
  49. }
  50. if ( argc == 1 ) {
  51. long s1 = 0;
  52. long s2 = 0;
  53. long s3 = 0;
  54. long m1 = 0;
  55. for ( i = 0; i < rects_size; ++i ) {
  56. r = rects[i];
  57. s1 = r.l * r.w;
  58. s2 = r.w * r.h;
  59. s3 = r.h * r.l;
  60. m1 = BL_MIN(s2, s3);
  61. res += (s1 * 2) + (s2 * 2) + (s3 * 2) + BL_MIN(s1, m1);
  62. }
  63. } else {
  64. long m1 = 0;
  65. long m2 = 0;
  66. long ma1 = 0;
  67. for ( i = 0; i < rects_size; ++i ) {
  68. r = rects[i];
  69. m1 = BL_MIN(r.l, r.w);
  70. ma1 = BL_MAX(r.l, r.w);
  71. m2 = BL_MIN(r.h, ma1);
  72. res += ((m1 + m1 + m2 + m2) + (r.l * r.w * r.h));
  73. }
  74. }
  75. printf("Result: %ld\n", res);
  76. free(rects);
  77. free(raw_input);
  78. (void) argc; (void) argv;
  79. return 0;
  80. }