main.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. qsort(left, left_size, sizeof(*left), cmp_sort);
  55. qsort(right, right_size, sizeof(*right), cmp_sort);
  56. if ( left_size != right_size ) {
  57. printf("Sizes differ");
  58. exit(EXIT_FAILURE);
  59. }
  60. for ( i = 0; i < left_size; ++i ) {
  61. res += labs(left[i] - right[i]);
  62. }
  63. printf("Result: %ld\n", res);
  64. free(left);
  65. free(right);
  66. free(raw_input);
  67. (void) argc; (void) argv;
  68. return 0;
  69. }
  70. size_t
  71. cstr_char_count(const char *cstr, char c)
  72. {
  73. size_t ret = 0;
  74. while ( *cstr != '\0' ) {
  75. ret += ( *cstr == c );
  76. cstr++;
  77. }
  78. return ret;
  79. }
  80. int
  81. cmp_sort(const void *this, const void *other)
  82. {
  83. long this_ = *((long*) this);
  84. long other_ = *((long*) other);
  85. return (int) (this_ - other_);
  86. }