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 }