day3.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LINE_MAX 50
  5. int arraySize = 0;
  6. char **readInput(FILE *fp) {
  7. char **array = NULL;
  8. int index = 0;
  9. while (1) {
  10. if (feof(fp)) break;
  11. char *p = malloc(LINE_MAX);
  12. if (!p) return NULL;
  13. if (1 != fscanf(fp, "%s\n", p))
  14. return NULL;
  15. arraySize++;
  16. char **newArray = realloc(array, sizeof(char*)*arraySize);
  17. if (!newArray) return NULL;
  18. array = newArray;
  19. array[index] = p;
  20. index++;
  21. }
  22. return array;
  23. }
  24. void freeArray(char **array) {
  25. for (int i = 0; i < arraySize; i++)
  26. free(array[i]);
  27. free(array);
  28. }
  29. long int traverse(int right, int down, char **array) {
  30. long int trees = 0;
  31. size_t x = right;
  32. size_t xMax = strlen(array[0]) - 1;
  33. int y = down;
  34. while (y < arraySize) {
  35. if (x > xMax) x = x - xMax - 1;
  36. if (array[y][x] == '#') trees++;
  37. x += right;
  38. y += down;
  39. }
  40. return trees;
  41. }
  42. int main(int argc, char **argv)
  43. {
  44. if (argc < 2) {
  45. puts("You need to specify path to file!");
  46. return -1;
  47. }
  48. FILE *fp = fopen(argv[1], "r");
  49. if (!fp) {
  50. puts("Can't read");
  51. return -1;
  52. }
  53. char **array = readInput(fp);
  54. if (!array) {
  55. puts("Can't read array!");
  56. return -1;
  57. }
  58. long int part1 = traverse(3, 1, array);
  59. printf("Part1: %ld\n", part1);
  60. long int x1 = traverse(1, 1, array);
  61. long int x2 = traverse(5, 1, array);
  62. long int x3 = traverse(7, 1, array);
  63. long int x4 = traverse(1, 2, array);
  64. printf("Part2: %ld\n", part1*x1*x2*x3*x4);
  65. fclose(fp);
  66. freeArray(array);
  67. }