main.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define IMP
  5. #include "../../file.h"
  6. #include "../../str.h"
  7. #define BL_MIN(v1, v2) ((((v1) >= (v2)) * (v2)) + (((v1) < (v2)) * (v1)))
  8. #define BL_MAX(v1, v2) ((((v1) >= (v2)) * (v1)) + (((v1) < (v2)) * (v2)))
  9. struct point {
  10. long x, y;
  11. };
  12. int
  13. main(int argc, char *argv[])
  14. {
  15. enum file_err ferr;
  16. long res = 0;
  17. size_t i = 0;
  18. size_t j = 0;
  19. struct point p = {0};
  20. struct point *points = NULL;
  21. size_t points_size = 1;
  22. struct str str_input = {0};
  23. char *raw_input = NULL;
  24. size_t raw_input_size = 0;
  25. raw_input = (char *) file_read_all("./input.txt",
  26. &raw_input_size,
  27. &ferr);
  28. if ( ferr != FILE_ERR_OK ) {
  29. fprintf(stderr, "Failed to open file: %s\n",
  30. file_err_to_cstr(ferr));
  31. exit(EXIT_FAILURE);
  32. }
  33. str_input = str_from_cstr(raw_input, raw_input_size);
  34. points = calloc(str_input.size + 1, sizeof(*points));
  35. {
  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. }
  57. if ( argc == 1 ) {
  58. struct point *uniqs = NULL;
  59. size_t uniqs_size = 0;
  60. uniqs = calloc(points_size, sizeof(*uniqs));
  61. for ( i = 0; i < points_size; ++i ) {
  62. p = points[i];
  63. for ( j = 0; j < uniqs_size; ++j ) {
  64. if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
  65. goto outer_continue;
  66. }
  67. }
  68. uniqs[uniqs_size++] = p;
  69. outer_continue: ;
  70. }
  71. res = (long) uniqs_size;
  72. free(uniqs);
  73. } else {
  74. }
  75. printf("Result: %ld\n", res);
  76. free(points);
  77. free(raw_input);
  78. (void) argc; (void) argv;
  79. return 0;
  80. }