From eb49caeeef06bc4d2981c235c6f483ecb54ece61 Mon Sep 17 00:00:00 2001 From: Izan Gil <66965250+SrIzan10@users.noreply.github.com> Date: Tue, 3 Dec 2024 21:54:51 +0100 Subject: [PATCH] feat: day 3 --- 2024/3/3.go | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 2024/3/3.go diff --git a/2024/3/3.go b/2024/3/3.go new file mode 100644 index 0000000..60ae3d2 --- /dev/null +++ b/2024/3/3.go @@ -0,0 +1,91 @@ +package main + +import ( + "fmt" + "os" + "regexp" + "strconv" + "strings" +) + +func p1(data string) int { + mult, _ := matchMul(data) + sum := 0 + for _, value := range mult { + sum += value + } + return sum +} + +func p2(data string) int { + sum := 0 + mulMult, mulIndexes := matchMul(data) + + matchDos, _ := regexp.Compile(`do+\(\)`) + matchDonts, _ := regexp.Compile(`don't+\(\)`) + doIndex := matchDos.FindAllStringIndex(data, -1) + dontIndex := matchDonts.FindAllStringIndex(data, -1) + resolvedDos := sliceLast2dValue(doIndex) + resolvedDonts := sliceLast2dValue(dontIndex) + resolvedMul := sliceLast2dValue(mulIndexes) + + for i, mulIndex := range resolvedMul { + lastControl := -1 + lastWasDo := true + + // find most recent control statement + for _, doIdx := range resolvedDos { + if doIdx < mulIndex && doIdx > lastControl { + lastControl = doIdx + lastWasDo = true + } + } + for _, dontIdx := range resolvedDonts { + if dontIdx < mulIndex && dontIdx > lastControl { + lastControl = dontIdx + lastWasDo = false + } + } + + if lastWasDo { + sum += mulMult[i] + } + } + + return sum +} + +func main() { + data, err := os.ReadFile("input.txt") + if err != nil { + fmt.Println("File reading error", err) + return + } + + fmt.Println("Part 1:", p1(string(data))) + fmt.Println("Part 2:", p2(string(data))) +} + +func matchMul(data string) (mults []int, index [][]int) { + var multiplications []int + match, _ := regexp.Compile(`mul\(\d{1,3},\d{1,3}\)`) + resolved := match.FindAllString(data, -1) + resolvedIndex := match.FindAllStringIndex(data, -1) + + numRegex, _ := regexp.Compile(`\d+,\d+`) + for _, resolves := range resolved { + num := strings.Split(numRegex.FindAllString(resolves, -1)[0], ",") + n0, _ := strconv.Atoi(num[0]) + n1, _ := strconv.Atoi(num[1]) + multiplications = append(multiplications, n0 * n1) + } + return multiplications, resolvedIndex +} + +func sliceLast2dValue(array [][]int) []int { + var finalList []int + for _, value1 := range array { + finalList = append(finalList, value1[1]) + } + return finalList +} \ No newline at end of file