diff --git a/internal/2022/DayThree/code.go b/internal/2022/DayThree/code.go index f9e374f..7776f94 100644 --- a/internal/2022/DayThree/code.go +++ b/internal/2022/DayThree/code.go @@ -10,6 +10,43 @@ func init() { registry.Register("2022D3", ParseInput, PartOne, PartTwo) } +func buildItemSet(items string) map[rune]bool { + itemSet := make(map[rune]bool) + for _, item := range items { + itemSet[item] = true + } + return itemSet +} + +func findCommonItem(itemSet map[rune]bool, items string) rune { + for _, item := range items { + if itemSet[item] { + return item + } + } + return 0 +} + +func findIntersection(itemSet map[rune]bool, items string) map[rune]bool { + intersection := make(map[rune]bool) + for _, item := range items { + if itemSet[item] { + intersection[item] = true + } + } + return intersection +} + +func getItemPriority(item rune) int { + if item >= 'a' && item <= 'z' { + return int(item - 'a' + 1) + } + if item >= 'A' && item <= 'Z' { + return int(item - 'A' + 27) + } + return 0 +} + func ParseInput(filepath string) []string { content, _ := os.ReadFile(filepath) return strings.Split(string(content), "\n") @@ -22,29 +59,29 @@ func PartOne(data []string) int { firstCompartment := rucksack[:compartmentSize] secondCompartment := rucksack[compartmentSize:] - firstCompartmentItems := make(map[rune]bool) - for _, item := range firstCompartment { - firstCompartmentItems[item] = true - } - - var commonItem rune - for _, item := range secondCompartment { - if firstCompartmentItems[item] { - commonItem = item - break - } - } - - if commonItem >= 'a' && commonItem <= 'z' { - totalPriority += int(commonItem - 'a' + 1) - } else if commonItem >= 'A' && commonItem <= 'Z' { - totalPriority += int(commonItem - 'A' + 27) - } + firstCompartmentItems := buildItemSet(firstCompartment) + commonItem := findCommonItem(firstCompartmentItems, secondCompartment) + totalPriority += getItemPriority(commonItem) } return totalPriority } func PartTwo(data []string) int { - return 0 + totalPriority := 0 + for i := 0; i < len(data); i += 3 { + if i+2 >= len(data) { + break + } + firstRucksack := data[i] + secondRucksack := data[i+1] + thirdRucksack := data[i+2] + + firstRucksackItems := buildItemSet(firstRucksack) + commonInFirstTwo := findIntersection(firstRucksackItems, secondRucksack) + badge := findCommonItem(commonInFirstTwo, thirdRucksack) + totalPriority += getItemPriority(badge) + } + + return totalPriority }