65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package day03
|
|
|
|
import (
|
|
"adventofcode2024/utils"
|
|
"fmt"
|
|
"regexp"
|
|
)
|
|
|
|
func Part1(input string) int {
|
|
val := 0
|
|
|
|
pattern := `mul\((\d{1,3}),(\d{1,3})\)`
|
|
re := regexp.MustCompile(pattern)
|
|
matches := re.FindAllStringSubmatch(input, -1)
|
|
|
|
fmt.Println("Matches found:")
|
|
for _, match := range matches {
|
|
if len(match) == 3 { // match[1] is x, match[2] is y
|
|
x := utils.MustAtoi(match[1])
|
|
y := utils.MustAtoi(match[2])
|
|
val += x * y
|
|
}
|
|
}
|
|
return val
|
|
}
|
|
|
|
func Part2(input string) int {
|
|
val := 0
|
|
pattern := `mul\((\d{1,3}),(\d{1,3})\)`
|
|
re := regexp.MustCompile(pattern)
|
|
matches := re.FindAllStringSubmatchIndex(input, -1)
|
|
|
|
fmt.Println("Matches found:")
|
|
for _, match := range matches {
|
|
if len(match) == 6 {
|
|
xStart, xEnd := match[2], match[3]
|
|
yStart, yEnd := match[4], match[5]
|
|
x := utils.MustAtoi(input[xStart:xEnd])
|
|
y := utils.MustAtoi(input[yStart:yEnd])
|
|
if do(input[:xStart]) {
|
|
val += x * y
|
|
}
|
|
}
|
|
}
|
|
return val
|
|
}
|
|
|
|
func do(input string) bool {
|
|
pattern := `don't\(\)|do\(\)`
|
|
re := regexp.MustCompile(pattern)
|
|
|
|
matches := re.FindAllString(input, -1)
|
|
|
|
if len(matches) > 0 {
|
|
// Get the last match
|
|
lastMatch := matches[len(matches)-1]
|
|
if lastMatch == "don't()" {
|
|
return false
|
|
} else if lastMatch == "do()" {
|
|
return true
|
|
}
|
|
}
|
|
return true
|
|
}
|