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

     1  #include "day7.h"
     2  
     3  #define BUFF_SIZE 200
     4  
     5  hashMap* bagMap;
     6  arrayList* bagList;
     7  
     8  arrayList* getEnclosedBags(char* line) {
     9      arrayList* bagL = createArrayList();
    10      bag* currentBag;
    11      while ((currentBag = getNextBag(&line))) {
    12          appendToAl(bagL, currentBag);
    13      }
    14      return bagL;
    15  }
    16  
    17  void parseLine(char* line) {
    18      char* bagKey = getBagName(&line);
    19      arrayList* enclosedBags = getEnclosedBags(line);
    20      appendToAl(bagList, bagKey);
    21      addToMap(bagMap, bagKey, enclosedBags, true);
    22  }
    23  
    24  bool canContainGoldBag(char* bagName) {
    25      arrayList* currentBagList = (arrayList*)getValueForKey(bagMap, bagName);
    26  
    27      if (!currentBagList) {
    28          //no match found in map
    29          printf("No match found for %s\n", bagName);
    30          return false;
    31      }
    32  
    33      bool found = false;
    34      for (int i = 0; i < getSize(currentBagList); i++) {
    35          bag* bag = getItemAt(currentBagList, i);
    36          if (strcmp("shiny gold", bag->color) == 0) {
    37              return true;
    38          } else {
    39              if (canContainGoldBag(bag->color)) {
    40                  found = true;
    41                  break;
    42              };
    43          }
    44      }
    45      return found;
    46  }
    47  
    48  int getShinyGoldCarrierCount() {
    49      int count = 0;
    50  
    51      for (int i = 0; i < getSize(bagList); i++) {
    52          char* bagName = getItemAt(bagList, i);
    53          if (canContainGoldBag(bagName)) {
    54              count++;
    55          }
    56      }
    57      return count;
    58  }
    59  
    60  int main() {
    61  
    62      FILE* in = fopen("day7.txt", "r");
    63  
    64      bagMap = createHashMap(strHash, strComp);
    65      bagList = createArrayList();
    66  
    67      for (char buff[BUFF_SIZE], *p = fgets(buff, BUFF_SIZE, in); p; p = fgets(buff, BUFF_SIZE, in)) {
    68          parseLine(buff);
    69      }
    70      // iterateMapPairs(bagMap, bagKvpPrinter);
    71      // puts("Rules:");
    72      // iterateListItems(bagList, strPrinter);
    73  
    74      int shinyGoldCarrierCount = getShinyGoldCarrierCount();
    75      printf("Part 1: Bags that can eventually contain at least one shiny gold bag: %i\n", shinyGoldCarrierCount);
    76      int bagsWithinShinyGold = findBagsWithinBag("shiny gold", 1);
    77      printf("Part 2: Bags within shiny gold bag: %i", bagsWithinShinyGold);
    78  
    79      freeBagMap();
    80      freeAl(bagList, false);
    81      fclose(in);
    82  }