main.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 point {
  8. long x, y;
  9. };
  10. int
  11. main(int argc, char *argv[])
  12. {
  13. enum file_err ferr;
  14. long res = 0;
  15. size_t i = 0;
  16. size_t j = 0;
  17. struct point p = {0};
  18. struct str str_input = {0};
  19. char *raw_input = NULL;
  20. size_t raw_input_size = 0;
  21. raw_input = (char *) file_read_all("./input.txt",
  22. &raw_input_size,
  23. &ferr);
  24. if ( ferr != FILE_ERR_OK ) {
  25. fprintf(stderr, "Failed to open file: %s\n",
  26. file_err_to_cstr(ferr));
  27. exit(EXIT_FAILURE);
  28. }
  29. str_input = str_from_cstr(raw_input, raw_input_size);
  30. if ( argc == 1 ) {
  31. struct point *uniqs = NULL;
  32. size_t uniqs_size = 0;
  33. struct point *points = NULL;
  34. size_t points_size = 1;
  35. points = calloc(str_input.size + 1, sizeof(*points));
  36. for ( i = 0; i < str_input.size; ++i ) {
  37. struct point *it = (points + i + 1);
  38. p = points[i];
  39. *it = p;
  40. switch ( str_input.data[i] ) {
  41. case '>':
  42. ++it->x;
  43. break;
  44. case '^':
  45. --it->y;
  46. break;
  47. case '<':
  48. --it->x;
  49. break;
  50. case 'v':
  51. ++it->y;
  52. break;
  53. }
  54. ++points_size;
  55. }
  56. uniqs = calloc(points_size, sizeof(*uniqs));
  57. for ( i = 0; i < points_size; ++i ) {
  58. p = points[i];
  59. for ( j = 0; j < uniqs_size; ++j ) {
  60. if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
  61. goto outer_continue_p1;
  62. }
  63. }
  64. uniqs[uniqs_size++] = p;
  65. outer_continue_p1: ;
  66. }
  67. res = (long) uniqs_size;
  68. free(points);
  69. free(uniqs);
  70. } else {
  71. struct point *uniqs = NULL;
  72. size_t uniqs_size = 0;
  73. struct point *rs = NULL;
  74. size_t rs_size = 0;
  75. struct point *hs = NULL;
  76. size_t hs_size = 0;
  77. /* Need only half of str_points.size, but who cares. */
  78. rs = calloc(str_input.size, sizeof(*rs));
  79. hs = calloc(str_input.size, sizeof(*hs));
  80. for ( i = 0; i < str_input.size; ++i ) {
  81. struct point *it = NULL;
  82. if ( (i & 1) == 0 ) {
  83. p = hs[hs_size];
  84. it = &hs[(hs_size++) + 1];
  85. } else {
  86. p = rs[rs_size];
  87. it = &rs[(rs_size++) + 1];
  88. }
  89. *it = p;
  90. switch ( str_input.data[i] ) {
  91. case '>':
  92. ++it->x;
  93. break;
  94. case '^':
  95. --it->y;
  96. break;
  97. case '<':
  98. --it->x;
  99. break;
  100. case 'v':
  101. ++it->y;
  102. break;
  103. }
  104. }
  105. uniqs = calloc(rs_size + hs_size, sizeof(*uniqs));
  106. for ( i = 0; i < str_input.size; ++i ) {
  107. if ( i < hs_size ) {
  108. p = hs[i];
  109. for ( j = 0; j < uniqs_size; ++j ) {
  110. if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
  111. goto not_uniq_1;
  112. }
  113. }
  114. uniqs[uniqs_size++] = p;
  115. not_uniq_1: ;
  116. }
  117. if ( i < rs_size ) {
  118. p = rs[i];
  119. for ( j = 0; j < uniqs_size; ++j ) {
  120. if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
  121. goto not_uniq_2;
  122. }
  123. }
  124. uniqs[uniqs_size++] = p;
  125. not_uniq_2: ;
  126. }
  127. }
  128. res = (long) uniqs_size;
  129. free(hs);
  130. free(rs);
  131. free(uniqs);
  132. }
  133. printf("Result: %ld\n", res);
  134. free(raw_input);
  135. (void) argc; (void) argv;
  136. return 0;
  137. }