main.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define IMP
  5. #include "../../file.h"
  6. size_t cstr_char_count(const char *cstr, char c);
  7. int cmp_sort(const void *this, const void *other);
  8. int
  9. main(int argc, char *argv[])
  10. {
  11. enum file_err ferr;
  12. size_t line_num = 0;
  13. size_t i = 0;
  14. long res = 0;
  15. long *left = NULL;
  16. size_t left_size = 0;
  17. long *right = NULL;
  18. size_t right_size = 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. line_num = cstr_char_count(raw_input, '\n');
  30. left = calloc(line_num+1, sizeof(*left));
  31. right = calloc(line_num+1, sizeof(*right));
  32. {
  33. long ret = -1;
  34. char *str = raw_input;
  35. char *nstr = NULL;
  36. long *doing = left;
  37. size_t *doing_size = &left_size;
  38. while ( true ) {
  39. ret = strtol(str, &nstr, 10);
  40. if ( ret == 0 ) {
  41. break;
  42. }
  43. str = nstr;
  44. doing[(*doing_size)++] = ret;
  45. if ( doing == left ) {
  46. doing = right;
  47. doing_size = &right_size;
  48. } else {
  49. doing = left;
  50. doing_size = &left_size;
  51. }
  52. }
  53. }
  54. if ( left_size != right_size ) {
  55. printf("Sizes differ");
  56. exit(EXIT_FAILURE);
  57. }
  58. if ( argc == 1 ) {
  59. qsort(left, left_size, sizeof(*left), cmp_sort);
  60. qsort(right, right_size, sizeof(*right), cmp_sort);
  61. for ( i = 0; i < left_size; ++i ) {
  62. res += labs(left[i] - right[i]);
  63. }
  64. } else {
  65. for ( i = 0; i < left_size; ++i ) {
  66. size_t j = 0;
  67. long it = left[i];
  68. long count = 0;
  69. for ( j = 0; j < right_size; ++j ) {
  70. count += ( it == right[j] );
  71. }
  72. res += it * count;
  73. }
  74. }
  75. printf("Result: %ld\n", res);
  76. free(left);
  77. free(right);
  78. free(raw_input);
  79. (void) argc; (void) argv;
  80. return 0;
  81. }
  82. size_t
  83. cstr_char_count(const char *cstr, char c)
  84. {
  85. size_t ret = 0;
  86. while ( *cstr != '\0' ) {
  87. ret += ( *cstr == c );
  88. cstr++;
  89. }
  90. return ret;
  91. }
  92. int
  93. cmp_sort(const void *this, const void *other)
  94. {
  95. long this_ = *((long*) this);
  96. long other_ = *((long*) other);
  97. return (int) (this_ - other_);
  98. }