github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2020/day1/day1.c (about)

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4  #define INPUT_FILE_1 "day1.txt"
     5  #define MAX_CHAR 200
     6  
     7  void partOne() {
     8  
     9      FILE* dayOneInput = fopen(INPUT_FILE_1, "r");
    10  
    11      char buckets[2000] = { 0 };
    12  
    13      for (char buffer[MAX_CHAR]; fgets(buffer, MAX_CHAR, dayOneInput);) {
    14          int num = atoi(buffer);
    15          int searchVal = 2020 - num;
    16          if (buckets[searchVal]) {
    17              printf("Nums: %d, %d\n", num, searchVal);
    18              printf("Answer: %d\n", num * searchVal);
    19              break;
    20          }
    21          buckets[num] = 1;
    22      }
    23  
    24      fclose(dayOneInput);
    25  }
    26  
    27  #define BUCKET_COUNT 10000
    28  
    29  typedef struct {
    30      int num1;
    31      int num2;
    32  } numPair;
    33  
    34  numPair* createNumPair(int num1, int num2) {
    35      numPair* np = malloc(sizeof(numPair));
    36      *np = (numPair) { num1, num2 };
    37      return np;
    38  }
    39  
    40  void freePairs(numPair** buckets, int len) {
    41      for (int i = 0; i < len; i++) {
    42          if (buckets[i]) {
    43              free(buckets[i]);
    44          }
    45      }
    46  }
    47  
    48  void partTwo() {
    49  
    50      FILE* inputFile = fopen(INPUT_FILE_1, "r");
    51      FILE* inputFile2 = fopen(INPUT_FILE_1, "r");
    52  
    53      numPair* buckets[BUCKET_COUNT] = { NULL };
    54      for (char buffer[MAX_CHAR]; fgets(buffer, MAX_CHAR, inputFile);) {
    55          int num1 = atoi(buffer);
    56          for (char buffer2[MAX_CHAR]; fgets(buffer2, MAX_CHAR, inputFile2);) {
    57              int num2 = atoi(buffer2);
    58              int addition = num2 + num1;
    59              if (!buckets[addition]) {
    60                  buckets[addition] = createNumPair(num1, num2);
    61              }
    62          }
    63          fseek(inputFile2, 0, SEEK_SET);
    64      }
    65  
    66      for (char buffer[MAX_CHAR]; fgets(buffer, MAX_CHAR, inputFile2);) {
    67          int num = atoi(buffer);
    68          int searchVal = 2020 - num;
    69          if (buckets[searchVal]) {
    70              printf("Nums: %d, %d, %d\n", buckets[searchVal]->num1, buckets[searchVal]->num2, num);
    71              printf("Answer: %d\n", buckets[searchVal]->num1 * buckets[searchVal]->num2 * num);
    72              break;
    73          }
    74      }
    75  
    76      freePairs(buckets, BUCKET_COUNT);
    77      fclose(inputFile);
    78      fclose(inputFile2);
    79  }
    80  
    81  int main() {
    82      printf("Part one:\n");
    83      partOne();
    84      printf("\nPart two:\n");
    85      partTwo();
    86      return 0;
    87  }